crazyfile的stm32 pwm频率计算为什么是18K

PWM(脉冲宽度调制)的应用
一、PWM怎样工作在ARM Linux中
1. 什么是PWM?
PWM(脉冲宽度调制)简单的讲是一种变频技术之一,是靠改变脉冲宽度来控制输出电压,通过改变周期来控制其输出频率。如果还不是很清楚,好吧,来看看我们实际生活中的例子,我们的电风扇为什么扭一下按扭,风扇的转速就会发生变化;调一下收音机的声音按钮,声音的大小就会发生变化;还有待会儿我们要讲的蜂鸣器也会根据不同的输入值而发出不同频率的叫声等等!!这些都是PWM的应用,都是通过PWM输出的频率信号进行控制的。
2. ARM Linux中的PWM
根据S3C2440的手册介绍,S3C2440A内部有5个16位的定时器,定时器0、1、2、3都带有脉冲宽度调制功能(PWM),定时器4是一个没有输出引脚的内部定时器,定时器0有一个用于大电流设备的死区生成器。看下图解释吧!!
由S3C2440的技术手册和上面这幅结构图,我们来总结一下2440内部定时器模块的特性吧:
1)共5个16位的定时器,定时器0、1、2、3都带有脉冲宽度调制功能(PWM);
2)每个定时器都有一个比较缓存寄存器(TCMPB)和一个计数缓存寄存器(TCNTB);
3)定时器0、1共享一个8位的预分频器(预定标器),定时器2、3、4共享另一个8位的预分频器(预定标器),其值范围是0~255;
4)定时器0、1共享一个时钟分频器,定时器2、3、4共享另一个时钟分频器,这两个时钟分频器都能产生5种不同的分频信号值(即:1/2、1/4、1/8、1/16和TCLK);
5)两个8位的预分频器是可编程的且根据装载的值来对PCLK进行分频,预分频器和钟分频器的值分别存储在定时器配置寄存器TCFG0和TCFG1中;
6)有一个TCON控制寄存器控制着所有定时器的属性和状态,TCON的第0~7位控制着定时器0、第8~11位控制着定时器1、第12~15位控制着定时器2、第16~19位控制着定时器3、第20~22位控制着定时器4。
还是根据S3C2440手册的描述和上图的结构,要开始一个PWM定时器功能的步骤如下(假设使用的是第一个定时器):
1)分别设置定时器0的预分频器值和时钟分频值,以供定时器0的比较缓存寄存器和计数缓存寄存器用;
2)设置比较缓存寄存器TCMPB0和计数缓存寄存器TCNTB0的初始值(即定时器0的输出时钟频率);
3)关闭定时器0的死区生成器(设置TCON的第4位);
4)开启定时器0的自动重载(设置TCON的第3位);
5)关闭定时器0的反相器(设置TCON的第2位);
6)开启定时器0的手动更新TCNTB0&TCMPB0功能(设置TCON的第1位);
7)启动定时器0(设置TCON的第0位);
8)清除定时器0的手动更新TCNTB0&TCMPB0功能(设置TCON的第1位)。
由此可以看到,PWM的输出频率跟比较缓存寄存器和计数缓存寄存器的取值有关,而比较缓存寄存器和计数缓存寄存器的值又跟预分频器和时钟分频器的值有关;要使用PWM功能其实也就是对定时器的相关寄存器进行操作。手册上也有一个公式:定时器输出频率
= PCLK / {预分频器值 + 1} / 时钟分频值。下面我们来通过一个蜂鸣器的实例来说明PWM功能的使用。
二、蜂鸣器驱动实例
1. 蜂鸣器的种类和工作原理
蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。
压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。有的压电式蜂鸣器外壳上还装有发光二极管。多谐振荡器由晶体管或集成电路构成。当接通电源后(1.5~15V直流工作电压),多谐振荡器起振,输出1.5~2.5kHZ的音频信号,阻抗匹配器推动压电蜂鸣片发声。
电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场。振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。
有源蜂鸣器和无源蜂鸣器的区别:这个“源”字是不是指电源,而是指震荡源,即有源蜂鸣器内有振荡源而无源蜂鸣器内部没有振荡源。有振荡源的通电就可以发声,没有振荡源的需要脉冲信号驱动才能发声。
&& 额外知识:简单蜂鸣器的制作方法
1)制备电磁铁M:在长约6厘米的铁螺栓上绕100圈导线,线端留下5厘米作引线,用透明胶布把线圈粘好,以免线圈松开,再用胶布把它粘在一个盒子上,电磁铁就做好了;
2)制备弹片P:从铁罐头盒上剪下一条宽约2厘米的长铁片,弯成直角,把电磁铁的一条引线接在弹片上,再用胶布把弹片紧贴在木板上;
3)用曲别针做触头Q,用书把曲别针垫高,用胶布粘牢,引出一条导线,如图连接好电路;
4)调节M与P之间的距离(通过移动盒子),使电磁铁能吸引弹片,调节触点与弹片之间的距离,使它们能恰好接触,通电后就可以听到蜂鸣声。
2. 开发板上蜂鸣器原理图分析
由原理图可以得知,蜂鸣器是通过GPB0
IO口使用PWM信号驱动工作的,而GPB0口是一个复用的IO口,要使用它得先把他设置成TOUT0 PWM输出模式。
3. 编写合适开发板的蜂鸣器驱动程序,文件名:my2440_pwm.c
#include &linux/module.h&
#include &linux/init.h&
#include &linux/kernel.h&
#include &linux/fs.h&
#include &linux/errno.h&
#include &linux/clk.h&
#include &linux/device.h&
#include &asm/io.h&
#include &mach/hardware.h&
#include &mach/regs-gpio.h&
#include &plat/regs-timer.h&
#define PWM_MAJOR
0&&&&&&&&&&&&&&&&&&//主设备号
#define PWM_NAME "my2440_pwm"&&&&&&&&//设备名称
static int device_major = PWM_MAJOR;&//系统动态生成的主设备号
//打开设备
static int pwm_open(struct
inode *inode, struct file *file)
&&&&//对GPB0复用口进行复用功能设置,设置为TOUT0
&&&&s3c2410_gpio_cfgpin(S3C2410_GPB0,
S3C2410_GPB0_TOUT0);
&&&&return
//关闭设备
static int pwm_close(struct
inode *inode, struct file *file)
&&&&return
//对设备进行控制
static int pwm_ioctl(struct
inode *inode, struct file *file,
unsigned int cmd, unsigned long arg)
&&&&if(cmd
&= 0)//如果输入的参数小于或等于0的话,就让蜂鸣器停止工作
&&&&&&&&//这里又恢复GPB0口为IO口输出功能,由原理图可知直接给低电平可让蜂鸣器停止工作
&&&&&&&&s3c2410_gpio_cfgpin(S3C2410_GPB0,
S3C2410_GPB0_OUTP);
&&&&&&&&s3c2410_gpio_setpin(S3C2410_GPB0,
&&&&else//如果输入的参数大于0,就让蜂鸣器开始工作,不同的参数,蜂鸣器的频率也不一样
&&&&&&&&//定义一些局部变量
&&&&&&&&unsigned
long tcon;
&&&&&&&&unsigned
long tcnt;
&&&&&&&&unsigned
long tcfg1;
&&&&&&&&unsigned
long tcfg0;
&&&&&&&&struct
clk *clk_p;
&&&&&&&&unsigned
long pclk;
&&&&&&&&//以下对各寄存器的操作结合上面讲的开始一个PWM定时器的步骤和2440手册PWM寄存器操作部分来看就比较容易理解
&&&&&&&&tcfg1
= __raw_readl(S3C2410_TCFG1);&&&&
//读取定时器配置寄存器1的值
&&&&&&&&tcfg0
= __raw_readl(S3C2410_TCFG0);&&&&
//读取定时器配置寄存器0的值
&&&&&&&&tcfg0
&= ~S3C2410_TCFG_PRESCALER0_MASK;
&&&&&&&&tcfg0
- 1);&&&&&&&&&&&&&&&&&&&&&
//设置tcfg0的值为49
&&&&&&&&tcfg1
&= ~S3C2410_TCFG1_MUX0_MASK;
&&&&&&&&tcfg1
|= S3C2410_TCFG1_MUX0_DIV16;&&&&&
//设置tcfg1的值为0x0011即:1/16
&&&&&&&&__raw_writel(tcfg1,
S3C2410_TCFG1);&&&&
//将值tcfg1写入定时器配置寄存器1中
&&&&&&&&__raw_writel(tcfg0,
S3C2410_TCFG0);&&&&
//将值tcfg0写入定时器配置寄存器0中
&&&&&&&&clk_p
= clk_get(NULL,
&&&&&&&&pclk
= clk_get_rate(clk_p);&&
//从系统平台时钟队列中获取pclk的时钟频率,在include/linux/clk.h中定义
&&&&&&&&tcnt
= (pclk/50/16)/cmd;&&&&&
//计算定时器0的输出时钟频率(pclk/{prescaler0 +
1}/divider value)
&&&&&&&&__raw_writel(tcnt,
S3C2410_TCNTB(0));&&
//设置定时器0计数缓存寄存器的值
&&&&&&&&__raw_writel(tcnt/2,
S3C2410_TCMPB(0));
//设置定时器0比较缓存寄存器的值
&&&&&&&&tcon
= __raw_readl(S3C2410_TCON);&&&&&&
//读取定时器控制寄存器的值
&&&&&&&&&&&&&&&&&&&
&&&&&&&&tcon
&&&&&&&&tcon
|= 0xb;& //关闭死区、自动重载、关反相器、更新TCNTB0&TCMPB0、启动定时器0
&&&&&&&&__raw_writel(tcon,
S3C2410_TCON);&&//设置定时器控制寄存器的0-4位,即对定时器0进行控制
&&&&&&&&tcon
&&&&&&&&__raw_writel(tcon,
S3C2410_TCON); //清除定时器0的手动更新位
&&&&return
//设备操作结构体
static struct file_operations pwm_fops
&&&&.owner&&
= THIS_MODULE,
&&&&.open&&&
= pwm_open,
&&&&.release
= pwm_close,
&&&&.ioctl&&
= pwm_ioctl,
//定义一个设备类
static struct class *pwm_class;
static int __init pwm_init(void)
&&&&//注册为字符设备,主设备号为0让系统自动分配,设备名为my2440_pwm,注册成功返回动态生成的主设备号
&&&&device_major
= register_chrdev(PWM_MAJOR, PWM_NAME, &pwm_fops);
&&&&if(device_major
&&&&&&&&printk(PWM_NAME
" register
falid!\n");
&&&&&&&&return
device_major;
&&&&//注册一个设备类,使mdev可以在/dev/目录下自动建立设备节点
&&&&pwm_class
= class_create(THIS_MODULE, PWM_NAME);
&&&&if(IS_ERR(pwm_class))
&&&&&&&&printk(PWM_NAME
" register class
falid!\n");
&&&&&&&&return
&&&&//创建一个设备节点,设备名为PWM_NAME,即:my2440_pwm
&&&&device_create(pwm_class,
NULL, MKDEV(device_major, 0),
NULL, PWM_NAME);
&&&&return
static void __exit pwm_exit(void)
&&&&//注销设备
&&&&unregister_chrdev(device_major,
PWM_NAME);
&&&&//删除设备节点
&&&&device_destroy(pwm_class,
MKDEV(device_major, 0));
&&&&//注销设备类
&&&&class_destroy(pwm_class);
module_init(pwm_init);
module_exit(pwm_exit);
MODULE_LICENSE("PGL");
MODULE_AUTHOR("Huang Gang");
MODULE_DESCRIPTION("my2440 pwm driver");
4. 将PWM蜂鸣器驱动代码部署到内核中。
/linux-2.6.30.4/drivers/char/Kconfig
//添加PWM蜂鸣器设备配置
/linux-2.6.30.4/drivers/char/Makefile
//添加PWM蜂鸣器设备配置
obj-$(CONFIG_MY2440_PWM_BEEP)
my2440_pwm.o
5.配置内核,选择PWM蜂鸣器设备选项
menuconfig
Device Drivers
&&&&Character
devices ---&
&&&&&&&&&*&
My2440 PWM Beep Device (NEW)
编译内核并下载到开发板上。这里要注意,现在我们不需要手动的在开发板上创建设备的节点了,因为我们现在使用了mdev进行管理了(使用方法请看:),在驱动程序中也添加了对类设备接口的支持。之前讲的一些驱动都没有,以后我们都使用这种方法。现在可以查看到/dev目录下自动创建好的my2440_pwm设备节点,就直接可以使用它了。
7. 编写PWM蜂鸣器驱动的测试程序。文件名:pwm_test.c
#include &stdio.h&
#include &stdlib.h&
#include &fcntl.h&
#include &sys/ioctl.h&
int main(int
argc, char **argv)
&&&&//打开蜂鸣器设备
= open("/dev/my2440_pwm", O_RDWR);
&&&&&&&&printf("Open
PWM Device Faild!\n");
&&&&&&&&exit(1);
&&&&//提示用户输入一个参数来对蜂鸣器进行调频,0表示停止工作
&&&&printf("please
enter the times number(0 is stop):\n");
&&&&while(1)
&&&&&&&&//输入参数
&&&&&&&&scanf("%d",
&&&&&&&&printf("times
= %d\n", tmp);
&&&&&&&&//IO控制
&&&&&&&&ioctl(fd,
&&&&&&&&if(tmp
&&&&&&&&&&&&break;
&&&&//关闭设备
&&&&close(fd);
&&&&return
8. 在开发主机上交叉编译测试应用程序,并复制到文件系统的/usr/sbin目录下,然后重新编译文件系统下载到开发板上。
#arm-linux-gcc -o
pwm_test pwm_test.c
9. 在开发板上运行测试程序。可以看到根据你输入参数的大小,蜂鸣器也会发生不同频率的叫声,输入0蜂鸣器停止鸣叫。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。刚刚完成的小四轴_四轴飞行器吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:28,756贴子:
刚刚完成的小四轴收藏
视频来自:
眨眼间,从事四轴开发已经有一年半了。话说,四轴跟我还真的很有缘。从电赛的不得已选题,到毕设的时候,选题也只剩下四轴。最后去公司上班,也还是强迫被分配到四轴。
其实起飞的平稳度,很容易判定一个四轴做的好坏。
如果有同样爱好四轴的的,我们可以一起来探讨下,可以加我的四轴群
我认为,四轴是集算法,控制,还有电子应用等,比较前沿的领域,学习了对以后的发展还是很有帮助的。其实,四轴的亮点已经不在于飞的平稳了,事实上,市场上的四轴飞的都很平稳。如果要说最大的亮点,我认为抛飞和3D翻滚才是真正区别控制的好与坏。当然,大四轴并不敢这么干。如果你有四轴,你评估下自己的四轴能不能抛飞和翻滚,就知道自己的技术怎么样了。因为这两者绝对是远远超出一般控制。哪怕一个滤波都会让这两个功能完全不能实现
有人很不理解什么是双闭环,请看这里! 当四轴飞行器正常飞行时,突遇外力(风等)或磁场干扰,使加速度传感器或磁力传感器采集数据失真,造成姿态解算出来的欧拉角错误,只用角度单环情况下,使系统很难稳定运行,因此可以加入角速度作为内环,角速度由陀螺仪采集数据输出,采集值一般不存在受外界影响情况,抗干扰能力强,并且角速度变化灵敏,当受外界干扰时,回复迅速;同理,高度环中气压传感器同样也会受到外界干扰,引入z轴加速度环可有效避免外界干扰造成的影响,增强了系统的鲁棒性。四轴飞行器双闭环PID控制,如图3、图4所示。角度作为外环,角速度作为内环,进行姿态PID控制;当需要定高时,高度作为外环,z轴加速度作为内环,进行高度PID控制。其中,PID输出为油门值,油门给定电子调速器值,
事实上,加速度是一个非常容易受振动影响的传感器,所以姿态解算出来也没有角速度来的稳。不信你们用匿名上位机看角速度和加速度的的曲线就知道加速度是有多么不可靠了。事实上,pid的参数值很多都是受干扰作用,从而导致没办法加大。此时应该增大滤波力度,就可以了。但别太过头了,滤波是有极限的
关注,年底也想试试
详细介绍下四轴姿态控制双闭环内环:内环作为控制主调节,选用角速度作为控制对象。内环注重PD控制,加上适当的I即可。外环:外环控制对象是角度。被控量是遥控控制角度,校准角度,姿态解算角的加减揉合。外环注重P,I少量,D其实可不加的,事实上调试证明,内环的D由于干扰大,加了也没什么效果。
楼主,视频里的四轴在室内起飞这么稳是有定位,还是靠熟练的不停的操作摇杆控制的?
有时候我真的觉得有些人是吃饱撑着,老是问四元数矩阵怎么来的,这个数学问题何必深究呢。整个四元数需要知道的就是加速度积分补偿运算的速率参数。
视频只是测试起飞的平稳度,只操控油门。
关于起飞的问题:
很多新手首飞失败在起飞,甚至老手也有突然起飞不了,直接翻了,或者说就算起飞,也往一边打。根据我一年多来的经验,我总结了一下通常所见到的原因:一、首先硬件问题,电机是两个正转两个反转,并且正转配正转的桨,反转配反转的桨。对轴相同,临轴相反,切记不能错了,否则任你是神仙也飞不起来,直接摔到一遍。二、小四轴还有齿轮问题,观察齿轮衔接处在启动时是否正确咬合。三、陀螺仪问题,很多新手会把陀螺仪给装错了。陀螺仪通常装在正中间,切必须Y轴指向机头(因为机头为俯仰角),通常机头为两个红色的机臂作为标志(当然你喜欢黑色也行),新手缺不知道颜色的作用,看着自己喜好装。什么是XY轴,你们看下MPU60X0系列的模块上都会有标识的,自己淘宝搜索这个模块(自己有的直接拿出来看看)。四、校准没通过。我们的瞬时姿态都是当前检测到的检测减去校准时的补偿值,要是校准没通过,那肯定出现问题。这些问题甚至是致命的。比如Z轴加速的校准如果失败,你的定高肯定不行。一般都要做校准没通过LED闪烁信号警报。五、数据读取问题,这个是个最基本问题了。不过很多人用开源飞控,压根就不懂得程序。所以应该是协调问题了,PX4对这点就做的很好,一旦器件没连接好就是发出错误信号,如果是致命的将不能飞行。六、姿态算法问题。很多人往一边飘的问题也可能是PID控制量太小,应加大系数。适当加一点I消除最后的静差。调试的时候稳定时还是会往一边倾斜也是这个问题。七、校准时没有水平。这种低级错误就不解释了。八、其它问题。这个问题很头疼,什么原因都可能,在线debug观察下数据到底在哪儿出了问题。但是在线调试对很多飞控板都很难实现,因为它们都没有调试器或者调试接口,像CC3D,APM,PX4,crazyfile......等等都是用工作调度的嵌入式程序架构,压根谈不上在线调试。好在它有一个很强大的串口输出,配合这些飞控官方给的上位机,自己的上位机也行,我觉的匿名的上位机就很不错。
早在半年前研究了一年的大四轴,最近半年都是在玩小四轴。
有好多新手问我,入门用什么飞控好?怎么学?
我都是回答一句,你是想学怎么玩还是想学怎么写飞控程序。如果想学怎么玩,那直接买个带遥控的飞飞,不懂飞的人可以来问下遥控怎么操控才是最稳。其实遥控很简单,新手对飞行没感觉可以这么学,一旦飞行器往一个方向飘的时候,轻轻往反方向拨一下就松开,这样就可以矫正了。如果是老手,那自然可以始终扶着方向,因为老手有感觉。
如果只是为了玩玩,那选择CC3D,APM,QQ飞控、PIXhawk,这个功能就很强大了,一般用在大四轴上。但是这样的飞控没点基础休想学会它的程序精华。
至于想学飞控程序的,那么就买一台DIY吧,这样你才能真正掌握。我比较推荐小的,大的太耗成本,撞坏了伤不起。现在开源飞控这么多。上图中那款全黑的飞控就很好学。类似这样的飞控像匿名、烈火、crazy系列、还有什么流星飞控啥的,直径大概12CM左右。这种飞行器,我总结的最大好处就是容易实现DIY功能,而且耐用,开源程序齐全。
新手可不建议学习嵌入式的任务调度架构,个人觉的像上面所说的难学的嵌入式四轴飞控,小四轴也有嵌入式的,我看的crazyfile就是典型的嵌入式程序,所以刚刚入门最好避开这些。
这里简单说明下大四轴和小四轴的区别1,硬件不同 大四轴几乎都用无刷电机,其特点就是转速高,损耗小。由于其电机内部没有电刷,少去了接触电阻,从而电机内阻减小,导通电流大,带载能力大,发热小。由于其工作电流大,一半mos管是承受不了的,所以要用电调驱动。电调就相当于一个大电流驱动器了。 小四轴一般用空心杯电机,其导通电流小,直接用mos管驱动。但别小看了这个小东西,空心杯内部转子是绕线薄薄一层杯壁上,最大的特点就是转动惯量小,转速超高,不带螺旋桨可达几万转!另外小四轴可能还带有减速齿轮。2,越小的飞行器,其内部数据和pid更新速率一般也越快。pwm也是如此。像px4的pid控制更新频率只能达到70hz,我曾经做过40hz,即25ms更新一次,都照样能飞。而且大四轴的pwm可能就几百hz,我做过400hz一样飞的稳。而小四轴就不一样了,几乎都是四五千hz。像烈火的四轴18k,够吓人吧,因为pwm频率越高,可以减小振动的。这些原因都是由于越大的四轴电机反应速度越慢。所以要求上来说,小四轴还是难于大四轴,可惜这点没人相信。我认为你们是没玩过像伟力这样的产品3,大四轴一般带有位置环,即GPS,光流,或者比赛中用的CCD,小四轴是不可能带这些的,因为它也不会飞的很远。载重也是最大的问题。4,大四轴pid要求比较松。一部分原因是带有位置环,另一部分原因是大四轴飞行动作没那么复杂,像翻滚就做不到。大四轴飞行很温柔,小四轴就像个杂耍,动作快。那些把小四轴当大四轴做的,比如匿名这些就得批评。我推荐一款叫做伟力的产品。两百多。你们试飞下就知道什么叫做四轴做的好有多牛逼了。没事多飞飞别人的,长点见识。
刚从网上买了个
新手为什么起飞的时候总是偏飞
楼主好厉害,我最近正在学弄小四轴,可是不会调陀螺仪,还有pid,楼主能介绍点经验吗?还有能分享一些资料吗?
四轴飞行器,双闭环PID怎么调?小白请看这里,老手来交流。
以姿态控制为例,所谓的双闭环。即是内环角速度环和外环姿态角度环。角速度就是陀螺仪的读取的数据,单位为rad/s,姿态环就是四元数解算后的结果。
在控制之前,先简单说下两个环之间的关系我一直跟别人说,如果四轴中有不理解的地方,不过过分去解读,没有多大的意义,比如四元数。我还认为双闭环就是个简单的控制系统,不要理解为复杂的系统。内环为主控,所以内环要无静差,反应快,干扰小。故以干扰较小的角速度作为内环。外环为辅控,要求不太高,所以姿态结算就算干扰大也没关系,也因为干扰,所以外环可以不要微分。 那么,现在开始调PID:我就直接介绍我最常用的快速调PID法了,如果要新手的调试,那就去网上找吧,那儿一大堆。1、首先你得先绑好你的飞行器,绑的时候固定其中的一个角,任意横滚或者俯仰角。2、首先调内环,这边我建议先给外环加一点P,至于多少,加0—0.5就好了,这边就跟别人不一样了,因为如果你单单只给内环调试,你有时候会发现动作很奇怪。内环直接给定外环的三倍以上。然后开始往上加。3、把内环的P加到会形成发散振荡,然后增大D,切记微分正负号不要弄错,否则任你是神仙也徒劳。此时如果增大D,你会发现系统逐渐变稳,如果不会变稳定,那说明你的P加太大了。一旦你发现变稳了,但静态时往一边倾斜(PID不够的时候就是这个现象)。那么别怀疑,增大你的外环吧。4、增大外环跟随者内环,内环大概是外环的2.5--4倍之间,切记不可将外环增至过大,如果外环增大了还是倾斜,此时更不用怀疑,该加内环了,跳回步奏3..(内环决定姿态控制速度,外环决定遥控控制力度,请不要过分的舍去外环)5、调至静差比较小的时候,适当加点I,要很小,0.005也好。如果发现能够消除最后的静差,那么恭喜你,可以进入微调。6、所谓的微调,那就是取精度更高。这点没的解释,但是我想说的是,这于我没有什么感觉,因为PID本身就是在一个区间内稳定,并且在这个区间内控制效果几乎差不多,况且飞行器的硬件参数在你飞几次后不断的变化,你怎么准确把握一个最稳定点。,这时候你就会发现,稳定了,却不能调的更稳。以上方法是我个人在调试的经验,供大家参考下,欢迎交流
楼主问一下淘宝上买的一百多的狼蛛四轴能玩吗?
楼主,我买了一个哈博森107D,感觉起飞没你这个这么稳定,偶尔会一边跑,可以说说怎么解决吗?另外,你的群号是多少?
楼主建议新手买个什么牌子什么型号的小四轴呢。
看到那么多玩飞控的玩法,我真的很心塞。从一个职业做飞控的人来讲,的确现在商业大四轴很多都直接用现成的的飞控,但是工作能从事这行的屈指可数。虽然用现成飞控的,但是也会自己写自己的程序。而小四轴产品研发都是从头到尾都是自己开发!我就特么的问一句,你是玩飞控还是学飞控!如果只是玩玩,那你们任性,玩的开心就好。要我只是玩玩,随便买个玩具都飞的比你们DIY的好。组装出一台飞控了不起?买些零件,给你个教程,小学生都会。就这样还想去找工作,门都没有。骚年们,飞控的精华在于算法!会用个APM,PX4,qq飞控啥的组装出一台四轴一点也没什么了不起的,当做玩玩就好,这是永远不可能有出路。
打算学飞控
楼主,遥控是你自己做的吗
在校大二渣一枚,赞同楼主大大的说法,准备自己用stm32做台迷你小四轴
楼主对四旋翼的一些看法跟我的一样,我也在自己写控制程序。完成了初步的飞行,下一步是深入优化。可否留个QQ咱们交个朋友
楼主我最近在写飞控程序,卡在视觉导航部分,不知楼主是否能指导一下
有事情请教一下
DIY前试飞别人的飞行器的好处我很喜欢研究别人的飞控怎么样,像匿名的四六轴、纸飞机、黑洞、creazyfile、pony、px4什么的,我基本都会研究它们怎么实现飞行的。有时候为了这些飞控的资料而进店买实物叫店家赠送,这些也花了不少钱。1、个人觉的做飞控之前一定要有参照,才能减小开发周期,像硬件,尤其是对入门者。买一台实物来参考,自己再DIY,这可以大大缩短开发周期。然后参照你所参考的飞控程序,做好以后与原机对比,调试程序也会大大缩短。2、飞别人的飞行器还有一个很大的有点就是参考其技术指标。比如定高效果,姿态控制效果该做到什么程度才好。比如说你试飞了伟力的定高,你才会知道定高做的好是牛逼到什么程度,说真的,定高没几个人做的好,我也做的不好。大部分飞控定高做的不好,连定高功能都没有。3、飞行功能的实现特点。比如说无头模式,3D翻滚等。没有试玩过翻滚的人根本就不会知道,3D翻滚不是简单的翻滚一圈,而是在翻滚的同时需要减少油门,这样才能在原地翻滚,因为360度翻滚飞行器的受力是圆周的,只有实现所有力只有360期望角变化的控制力,如果加上油门提供的力,那自己想象吧。4、比对多家的好处,这么多四轴都在卖,肯定各有千秋。
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或21ic官方微信-->
后使用快捷导航没有帐号?
查看: 1438|回复: 6
stm32f0 怎样提高固件库例子里面的pwminput捕获的频率、占空比精度
&&未结帖(20)
主题帖子积分
中级技术员, 积分 135, 距离下一级还需 165 积分
中级技术员, 积分 135, 距离下一级还需 165 积分
主题帖子积分
专家等级:结帖率:15%
主题帖子积分
中级技术员, 积分 135, 距离下一级还需 165 积分
中级技术员, 积分 135, 距离下一级还需 165 积分
用stm32f0discovery固件库里面的input_pwm例子输出的波形与实际我的信号发生器产生的波形不大一样,这是什么问题?该怎么才能使两者一样?
主题帖子积分
中级技术员, 积分 135, 距离下一级还需 165 积分
中级技术员, 积分 135, 距离下一级还需 165 积分
主题帖子积分
专家等级:结帖率:15%
主题帖子积分
中级技术员, 积分 135, 距离下一级还需 165 积分
中级技术员, 积分 135, 距离下一级还需 165 积分
&&******************************************************************************
&&******************************************************************************
&&* &h2&&center&& COPYRIGHT 2012 STMicroelectronics&/center&&/h2&
&&* Licensed under MCD-ST Liberty SW License Agreement V2, (the &License&);
&&* You may not use this file except in compliance with the License.
&&* You may obtain a copy of the License at:
&&*& && &&&
&&* Unless required by applicable law or agreed to in writing, software
&&* distributed under the License is distributed on an &AS IS& BASIS,
&&* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
&&* See the License for the specific language governing permissions and
&&* limitations under the License.
&&******************************************************************************
/* Includes ------------------------------------------------------------------*/
#include &stm32f0xx.h&
/** @addtogroup STM32F0_Discovery_Peripheral_Examples
/** @addtogroup TIM_PWM_Input
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
TIM_ICInitTypeDef&&TIM_ICInitS
TIM_TimeBaseInitTypeDef&&TIM_TimeBaseS
TIM_OCInitTypeDef&&TIM_OCInitS
GPIO_InitTypeDef GPIO_InitS
extern __IO uint32_t F
extern __IO uint16_t DutyC
/* Private function prototypes -----------------------------------------------*/
void TIM_Config(void);
void Output_TIM_Config(void);
/* Private functions ---------------------------------------------------------*/
&&* &&Main program.
&&* @param&&None
&&* @retval None
int main(void)
&&/*!& At this stage the microcontroller clock setting is already configured,
& && & this is done through SystemInit() function which is called from startup
& && & file (startup_stm32f0xx.s) before to branch to application main.
& && & To reconfigure the default setting of SystemInit() function, refer to
& && & system_stm32f0xx.c file
&&/* TIM Configuration */
&&TIM_Config();
&&Output_TIM_Config();
&&/* ---------------------------------------------------------------------------
& & TIM2 configuration: PWM Input mode
& & In this example TIM2 input clock (TIM2CLK) is set to APB1 clock (PCLK1)& &
& && &TIM2CLK = PCLK1
& && &=& TIM2CLK = HCLK = SystemCoreClock
& & External Signal Frequency = TIM3 counter clock / TIM3_CCR2 in Hz.
& & External Signal DutyCycle = (TIM3_CCR1*100)/(TIM3_CCR2) in %.
&&--------------------------------------------------------------------------- */
&&TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
&&TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_R
&&TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
&&TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
&&TIM_ICInitStructure.TIM_ICFilter = 0x0;
&&TIM_PWMIConfig(TIM3, &TIM_ICInitStructure);
&&/* Select the TIM3 Input Trigger: TI2FP2 */
&&TIM_SelectInputTrigger(TIM3, TIM_TS_TI2FP2);
&&/* Select the slave Mode: Reset Mode */
&&TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);
&&TIM_SelectMasterSlaveMode(TIM3,TIM_MasterSlaveMode_Enable);
&&/* TIM enable counter */
&&TIM_Cmd(TIM3, ENABLE);
&&/* Enable the CC2 Interrupt Request */
&&TIM_ITConfig(TIM3, TIM_IT_CC2, ENABLE);
&&/* TIM1 Main Output Enable */
&&TIM_CtrlPWMOutputs(TIM3, ENABLE);
&&/* Infinite loop */
&&while (1)
&&* @brief&&Configure the TIM IRQ Handler.
&&* @param&&None
&&* @retval None
void TIM_Config(void)
&&GPIO_InitTypeDef GPIO_InitS
&&NVIC_InitTypeDef NVIC_InitS
&&/* TIM3 clock enable */
&&RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
&&/* GPIOA clock enable */
&&RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
&&/* TIM3 chennel2 configuration : PA.01 */
&&GPIO_InitStructure.GPIO_Pin& &= GPIO_Pin_1;
&&GPIO_InitStructure.GPIO_Mode&&= GPIO_Mode_AF;
&&GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
&&GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
&&GPIO_InitStructure.GPIO_PuPd&&= GPIO_PuPd_UP ;
&&GPIO_Init(GPIOA, &GPIO_InitStructure);
&&/* Connect TIM pin to AF3 */
&&GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_2);
&&/* Enable the TIM3 global Interrupt */
&&NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
&&NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
&&NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
&&NVIC_Init(&NVIC_InitStructure);
void Output_TIM_Config(void)
&&/* GPIOA Clocks enable */
&&RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOA, ENABLE);
&&/* GPIOA Configuration: Channel 1, 2, 3 and 4 as alternate function push-pull */
&&GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 ;
&&GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
&&GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
&&GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
&&GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
&&GPIO_Init(GPIOA, &GPIO_InitStructure);
&&GPIO_PinAFConfig(GPIOA, GPIO_PinSource11, GPIO_AF_2);
& & & & /* TIM1 clock enable */
& & & & RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
& & & & /* Time Base configuration */
&&TIM_TimeBaseStructure.TIM_Prescaler = 0;
&&TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
&&TIM_TimeBaseStructure.TIM_Period = F
&&TIM_TimeBaseStructure.TIM_ClockDivision = 0;
&&TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
& & & & /* Channel 1, 2, 3 and 4 Configuration in PWM mode */
&&TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
&&TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_E
&&TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_E
&&TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_L
&&TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_H
&&TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_S
&&TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_R
& & & & TIM_OCInitStructure.TIM_Pulse = DutyC
&&TIM_OC1Init(TIM1, &TIM_OCInitStructure);
& & & & #ifdef&&USE_FULL_ASSERT
&&* @brief&&Reports the name of the source file and the source line number
&&*& && && &where the assert_param error has occurred.
&&* @param&&file: pointer to the source file name
&&* @param&&line: assert_param error line source number
&&* @retval None
void assert_failed(uint8_t* file, uint32_t line)
&&/* User can add his own implementation to report the file name and line number,
& &&&ex: printf(&Wrong parameters value: file %s on line %d\r\n&, file, line) */
&&/* Infinite loop */
&&while (1)
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
如上是我的主函数
void TIM3_IRQHandler(void)
&&RCC_ClocksTypeDef RCC_C
&&RCC_GetClocksFreq(&RCC_Clocks);
&&/* Clear TIM2 Capture compare interrupt pending bit */
&&TIM_ClearITPendingBit(TIM3, TIM_IT_CC3);
&&/* Get the Input Capture value */
&&IC3Value = TIM_GetCapture2(TIM3);
&&if (IC3Value != 0)
& & /* Duty cycle computation */
& & DutyCycle = (TIM_GetCapture1(TIM3) * 100) / IC3V
& & /* Frequency computation
& && & TIM3 counter clock = (RCC_Clocks.HCLK_Frequency)/2 */
& & Frequency =
& & & & & & & &
& & DutyCycle = 0;
& & Frequency = 0;
如上这是我的中断函数
实际测出来的波形高电平感觉是原来信号发生器的低电平的比例,占空比一调到13%就没有波形了
这是怎么回事 还有频率调节只能在0~100hz 调大就没波形了。&&
主题帖子积分
中级技术员, 积分 135, 距离下一级还需 165 积分
中级技术员, 积分 135, 距离下一级还需 165 积分
主题帖子积分
专家等级:结帖率:15%
主题帖子积分
中级技术员, 积分 135, 距离下一级还需 165 积分
中级技术员, 积分 135, 距离下一级还需 165 积分
我就想得到的波形跟实际波形是一模一样的 其他参数该怎么设置或者哪里设置错误了呢?求大神指点~
主题帖子积分
主题帖子积分
专家等级:结帖率:46%打赏:1.80受赏:15.00
主题帖子积分
Frequency =
M默认频率是72吗?
qq群: 嵌入式系统arm初学者 ←← +→→←←+ →→←←←←
主题帖子积分
主题帖子积分
专家等级:结帖率:100%打赏:0.00受赏:37.00
主题帖子积分
现在差多少呢???百分比
主题帖子积分
高级技术员, 积分 603, 距离下一级还需 397 积分
高级技术员, 积分 603, 距离下一级还需 397 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
高级技术员, 积分 603, 距离下一级还需 397 积分
高级技术员, 积分 603, 距离下一级还需 397 积分
同问 占空比 比较小时 pwm就没了
主题帖子积分
中级技术员, 积分 135, 距离下一级还需 165 积分
中级技术员, 积分 135, 距离下一级还需 165 积分
主题帖子积分
专家等级:结帖率:15%
主题帖子积分
中级技术员, 积分 135, 距离下一级还需 165 积分
中级技术员, 积分 135, 距离下一级还需 165 积分
mmuuss586 发表于
现在差多少呢???百分比
当占空比调到13%以下,就没有波形了,当频率调大于10Hz就没有波形了
技术领袖奖章
人才类勋章
荣誉元老奖章
等级类勋章
坚毅之洋流
发帖类勋章
时间类勋章
技术新星奖章
人才类勋章
涓涓之细流
发帖类勋章
时间类勋章

我要回帖

更多关于 stm32 pwm频率可调 的文章

 

随机推荐