是不是stm32f030 定时器例程F4定时器没有PWM互补输出

后使用快捷导航没有帐号?
查看: 2378|回复: 5
注册时间最后登录阅读权限10积分39精华0帖子
白丁, 积分 39, 距离下一级还需 11 积分
TA的每日心情开心 09:16签到天数: 1 天[LV.1]初来乍到
本帖最后由 短发小黄毛 于
13:59 编辑
本帖主要分享如何使用stm32的定时器互补PWM通道,驱动IPM模块产生三相相差120°的正弦波,可产生旋转磁场驱动三相电机。 看到这篇帖子不错,跟大家分享一下。
首先说几点:
1.我做这个旋转磁场只是为了验证一下硬件平台能不能用,所以程序里面没有写SPWM闭环控制算法,是一个纯开环的,但是大家可以在这个基础上写各种闭环算法。
2、我用的是stm32f103的timer1,因为是rct6型号,好像就这一个高级计时器,说一个基本知识,就是只有高级计时器才能产生互补通道,在三相控制驱动电机的时候,每个桥臂的上下桥臂不会同时打开。
3、我的IPM模块是IPM100RLA060,是低电平导通的,我之前没做过强电,第一次做,默认是高电平导通,炸了有7、8个保险丝之后才发现了这个问题,等于每次上电都是310v直接短路,那段时间一上电就觉得有东西要炸,好在最后发现了这个问题,之后就一直顺利,我说这个的原因是,因为是低电平导通,所以程序里面的死区我必须用高电平,但是据我的摸索,死区要设置高电平,只能TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_L
TIM_OCInitStructure.TIM_OCNPolarity=TIM_OCNPolarity_L
这样的话,在每次给CCR赋值的时候就不能直接赋sin表里面的值,就需要赋值周期值减去sin表。
具体的困惑写在了这个帖子里,有盆友发现了解决方案的可以留言告诉我,非常感谢
/posts/list/0/51941.htm?privmsg=26154&&sysid=4#296170
因为没有做低通滤波电路,所以,没图,就是直接在逻辑分析仪上看的,看完直接驱动电机很稳定,忘了截逻辑分析仪的图,
但是确实验证过了。
13:58 上传
13:58 上传
13:58 上传
13:58 上传
13:58 上传
13:58 上传
主函数里面只要写
TIM1_PWM_Init(-1);
TIM3_Int_Init(39,719);
初始化就行了,再开中断
sin表的数据是用论坛里面下的一个软件生成的,也可以自己算。附件是这个软件的安装包,另外由于格式原因文中不能直接打入代码,故代码文本版在附件。
(8.25 KB, 下载次数: 108)
13:59 上传
点击文件名下载附件
(6.43 KB, 下载次数: 71)
13:42 上传
点击文件名下载附件
注册时间最后登录阅读权限150积分1350精华0帖子
TA的每日心情奋斗 09:02签到天数: 8 天[LV.3]偶尔看看II
注册时间最后登录阅读权限10积分9精华0帖子
白丁, 积分 9, 距离下一级还需 41 积分
TA的每日心情开心 12:24签到天数: 1 天[LV.1]初来乍到
楼主给力& && && && &
注册时间最后登录阅读权限10积分18精华0帖子
白丁, 积分 18, 距离下一级还需 32 积分
TA的每日心情怒 18:54签到天数: 5 天[LV.2]偶尔看看I
楼主给力& && &
注册时间最后登录阅读权限10积分3精华0帖子
白丁, 积分 3, 距离下一级还需 47 积分
该用户从未签到
楼主给力,感恩共享精神
注册时间最后登录阅读权限10积分5精华0帖子
白丁, 积分 5, 距离下一级还需 45 积分
该用户从未签到
谢谢楼主大公无私精神
站长推荐 /4
10月26日,ADI、博通、Murata等业内大咖将汇聚上海探讨物联网领域的现状和未来,届时您将获得精彩的技术内容分享、与行业大牛面对面交流的机会、也将有幸见证2016年物联网创新设计大赛的优秀获奖作品,同时,我们还将为到厂的各位准备了大疆无人机、华米智能手表、红米手机等精美礼品!立即报名参加吧
泰克推出了多合一的混合域示波器,一台仪器包含了示波器、频谱仪、矢量分析仪与逻辑分析仪等多种功能。既可以满足物联网设计的跨域测量调试需求,又能一机多用,节省了公司在测试仪器上的开支。查看泰克示波器相关视频和技术文档,且看1台示波器如何媲美6台测试仪。
TI Store是TI在其官网上建立的一个TI产品在线购买平台。即日起至10月31日,参与本次问卷调查,你可以进一步了解TI Store,同时将有机会获得精美礼品的机会。
市场价499元的小e2 WiFi M303I-B评估板现免费申请,帮助用户快速将传感器或者MCU等采集到的数据快速上传到云端、或者用户手机端和PC端,从而开发自己的产品。
Powered by Discuz!21ic官方微信-->
后使用快捷导航没有帐号?
是不是STM32F030F4定时器没有PWM互补输出
&&已结帖(20)
主题帖子积分
资深技术员, 积分 316, 距离下一级还需 184 积分
资深技术员, 积分 316, 距离下一级还需 184 积分
主题帖子积分
专家等级:结帖率:88%
主题帖子积分
资深技术员, 积分 316, 距离下一级还需 184 积分
资深技术员, 积分 316, 距离下一级还需 184 积分
要用到一对PWM互补输出以驱动逆变器。考虑到STM8的干扰性可能会产生影响便选了一款STM32里面最便宜的一款STM32F030F4。但管脚分配却找不到一对完整的互补的PWM输出信号。但换了一款32脚的STM32F030K6Tx的片子却可以轻松找出3对PWM互补输出引脚。请教是否STM32F030F4这款不能用。然后问一下这些定时器的输出引脚分配感觉很乱。为毛。
本帖子中包含更多资源
才可以下载或查看,没有帐号?
www.mcutech.net
主题帖子积分
助理工程师, 积分 1462, 距离下一级还需 538 积分
助理工程师, 积分 1462, 距离下一级还需 538 积分
主题帖子积分
专家等级:结帖率:96%
主题帖子积分
助理工程师, 积分 1462, 距离下一级还需 538 积分
助理工程师, 积分 1462, 距离下一级还需 538 积分
找不到满足要求的引脚配置, 那就只能换芯片咯。
感觉引脚乱吗? 那也没办法, 只能适应。
要不, 给 ST 提提意见
主题帖子积分
中级工程师, 积分 3264, 距离下一级还需 1736 积分
中级工程师, 积分 3264, 距离下一级还需 1736 积分
主题帖子积分
专家等级:结帖率:6%
主题帖子积分
中级工程师, 积分 3264, 距离下一级还需 1736 积分
中级工程师, 积分 3264, 距离下一级还需 1736 积分
主题帖子积分
主题帖子积分
专家等级:结帖率:15%
主题帖子积分
应该这样讲,理论上有高级定时器,就应该有6个PWM输出的,但F封装可能是IO数不够吧,没有完整的6路PWM全部引出。
所以能,你要做逆变/马达,要用纯硬件输出三相互补对称PWM,030F封装是没有办法的。当然用软件模拟做方波驱动BLDC是没问题的
ST6、ST10、ST7、STR7、STR9、STM8S、STM8L、STM32、PowerPC,差不多ST曾经主流卖过的都用过。。。
不灌水,不废话。
主题帖子积分
中级技术员, 积分 147, 距离下一级还需 153 积分
中级技术员, 积分 147, 距离下一级还需 153 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
中级技术员, 积分 147, 距离下一级还需 153 积分
中级技术员, 积分 147, 距离下一级还需 153 积分
有的,在PB1&&TIM1_CH3N和PA10 TIM1_CH3
主题帖子积分
资深技术员, 积分 471, 距离下一级还需 29 积分
资深技术员, 积分 471, 距离下一级还需 29 积分
主题帖子积分
专家等级:结帖率:77%
主题帖子积分
资深技术员, 积分 471, 距离下一级还需 29 积分
资深技术员, 积分 471, 距离下一级还需 29 积分
有的,在PB1&&TIM1_CH3N和PA10 TIM1_CH3
你在瞎说吧,F030F4有PB脚吗??? 真是的
PA8——&PB1&
主题帖子积分
资深工程师, 积分 17482, 距离下一级还需 2518 积分
资深工程师, 积分 17482, 距离下一级还需 2518 积分
主题帖子积分
专家等级:结帖率:100%打赏:0.00受赏:21.10
主题帖子积分
资深工程师, 积分 17482, 距离下一级还需 2518 积分
资深工程师, 积分 17482, 距离下一级还需 2518 积分
这么高级的功能卖得太贱会赔本的。。。。。。。
主题帖子积分
资深工程师, 积分 17482, 距离下一级还需 2518 积分
资深工程师, 积分 17482, 距离下一级还需 2518 积分
主题帖子积分
专家等级:结帖率:100%打赏:0.00受赏:21.10
主题帖子积分
资深工程师, 积分 17482, 距离下一级还需 2518 积分
资深工程师, 积分 17482, 距离下一级还需 2518 积分
TIM1 CH3可以给出一对互补输出。
主题帖子积分
资深工程师, 积分 17482, 距离下一级还需 2518 积分
资深工程师, 积分 17482, 距离下一级还需 2518 积分
主题帖子积分
专家等级:结帖率:100%打赏:0.00受赏:21.10
主题帖子积分
资深工程师, 积分 17482, 距离下一级还需 2518 积分
资深工程师, 积分 17482, 距离下一级还需 2518 积分
看。。。。。
本帖子中包含更多资源
才可以下载或查看,没有帐号?
主题帖子积分
资深工程师, 积分 17482, 距离下一级还需 2518 积分
资深工程师, 积分 17482, 距离下一级还需 2518 积分
主题帖子积分
专家等级:结帖率:100%打赏:0.00受赏:21.10
主题帖子积分
资深工程师, 积分 17482, 距离下一级还需 2518 积分
资深工程师, 积分 17482, 距离下一级还需 2518 积分
你在瞎说吧,F030F4有PB脚吗??? 真是的
有的。。。。
主题帖子积分
中级技术员, 积分 130, 距离下一级还需 170 积分
中级技术员, 积分 130, 距离下一级还需 170 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
中级技术员, 积分 130, 距离下一级还需 170 积分
中级技术员, 积分 130, 距离下一级还需 170 积分
学习学习。
主题帖子积分
资深技术员, 积分 471, 距离下一级还需 29 积分
资深技术员, 积分 471, 距离下一级还需 29 积分
主题帖子积分
专家等级:结帖率:77%
主题帖子积分
资深技术员, 积分 471, 距离下一级还需 29 积分
资深技术员, 积分 471, 距离下一级还需 29 积分
有的。。。。
主题帖子积分
资深技术员, 积分 471, 距离下一级还需 29 积分
资深技术员, 积分 471, 距离下一级还需 29 积分
主题帖子积分
专家等级:结帖率:77%
主题帖子积分
资深技术员, 积分 471, 距离下一级还需 29 积分
资深技术员, 积分 471, 距离下一级还需 29 积分
有的。。。。
还真有,你这是什么软件,能否共享下呢,
主题帖子积分
资深工程师, 积分 17482, 距离下一级还需 2518 积分
资深工程师, 积分 17482, 距离下一级还需 2518 积分
主题帖子积分
专家等级:结帖率:100%打赏:0.00受赏:21.10
主题帖子积分
资深工程师, 积分 17482, 距离下一级还需 2518 积分
资深工程师, 积分 17482, 距离下一级还需 2518 积分
还真有,你这是什么软件,能否共享下呢,
CubeMX啊。。。。ST官网有的。。。
主题帖子积分
实习生, 积分 28, 距离下一级还需 22 积分
实习生, 积分 28, 距离下一级还需 22 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 28, 距离下一级还需 22 积分
实习生, 积分 28, 距离下一级还需 22 积分
你在瞎说吧,F030F4有PB脚吗??? 真是的
只能说你没仔细用过
主题帖子积分
中级工程师, 积分 4751, 距离下一级还需 249 积分
中级工程师, 积分 4751, 距离下一级还需 249 积分
主题帖子积分
专家等级:结帖率:0%打赏:0.00受赏:24.00
主题帖子积分
中级工程师, 积分 4751, 距离下一级还需 249 积分
中级工程师, 积分 4751, 距离下一级还需 249 积分
只能说你没仔细用过
:lol 好老的帖翻出来了
接rtos,wince,linux,stm32方面的嵌入式项目,/icview--1.html,支持 电话 QQ:
主题帖子积分
实习生, 积分 9, 距离下一级还需 41 积分
实习生, 积分 9, 距离下一级还需 41 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 9, 距离下一级还需 41 积分
实习生, 积分 9, 距离下一级还需 41 积分
请问STM32F030F4可以输出3路互补PWM信号吗?TIM1_CH2N和TIM1_CH1是哪两个引脚
技术高手奖章
人才类勋章
时间类勋章
晶莹之水滴
发帖类勋章
社区建设奖章
等级类勋章
欢快之小溪
发帖类勋章
时间类勋章
技术导师奖章
人才类勋章
湍急之河流
发帖类勋章
时间类勋章
技术新星奖章
人才类勋章
技术奇才奖章
人才类勋章
突出贡献奖章
等级类勋章
沉静之湖泊
发帖类勋章
奔腾之江水
发帖类勋章
时间类勋章
精英会员奖章
等级类勋章查看: 8206|回复: 0
stm32的定时器输入捕获与输出比较
本帖最后由 lianyiqun 于
18:18 编辑
& &明确一点对比AD的构造,stm32有3个AD,每个AD有很多通道,使用哪个通道就配置成哪个通道,这里定时器也如此,有很多定时器TIMx,每个定时器有很多CHx(通道),可以配置为输入捕捉-------测量频率用,也可以配置为输出比较--------输出PWM使用
输入捕捉:可以用来捕获外部事件,并为其赋予时间标记以说明此事件的发生时刻。
外部事件发生的触发信号由单片机中对应的引脚输入(具体可以参考单片机的datasheet),也可以通过模拟比较器单元来实现。
时间标记可用来计算频率,占空比及信号的其他特征,以及为事件创建日志,主要是用来测量外部信号的频率。
输出比较:定时器中计数寄存器在初始化完后会自动的计数。从bottom计数到top。并且有不同的工作模式。
另外还有个比较寄存器。一旦计数寄存器在从bottom到top计数过程中与比较寄存器匹配则会产生比较中断(比较中断使能的情况下)。
然后根据不同的工作模式计数寄存器将清零或者计数到top值。<font color="#、朋友,可以解释一下输入捕获的工作原理不?很简单,当你设置的捕获开始的时候,cpu会将计数寄存器的值复制到捕获比较寄存器中并开始计数,当再次捕捉到电平变化时,这是计数寄存器中的值减去刚才复制的值就是这段电平的持续时间,你可以设置上升沿捕获、下降沿捕获、或者上升沿下降沿都捕获。它没多大用处,最常用来测频率。 计数寄存器的初值,是自己写进去的吗?是的,不过默认不要写入 我如果捕获上升沿,两个值相减,代表的时两个上升沿中间那段电平的时间。对不?是的 timer1有五个通道(对应五个IO引脚),在同一时刻,只能捕获一个引脚的值,对不?那是肯定的,通道很像ADC通道,是可以进行切换的。 那输出比较的原理你可以帮我介绍一下不?这里有两个单元:一个计数器单元和一个比较单元,比较单元就是个双缓冲寄存器,比较单元的值是可以根据不同的模式设置的,与此同时,计数器在不停的计数,并不停的与比较寄存器中的值进行比较,当计数器的值与比较寄存器的值相等的时候一个比较匹配就发生了,根据自己的设置,匹配了是io电平取反、变低、还是变高,就会产生不同的波形了。 比较单元的值是人为设进去的吧?是的,但是他要根据你的控制寄存器的配置,来初始化你的比较匹配寄存器。
上面这个总看不懂,好像不不止你说的那几种情况:“匹配了是io电平取反、变低、还是变高,就会产生不同的波形了”就是比较匹配了你要IO电平怎么办?是清0还是置1?还是怎么样?这样才能产生波形啊 要不然你要比较单元有什么用呢? 设置输出就是置1,清除输出就是置0,切换输出就是将原来的电平取反,对不?是的 你理解的很快
<font color="#1:计数器向上计数达到最大值时将引脚置1,达到0时,引脚电平置0,,对不?恩 定时器1的输出比较模式怎么用。利用这个功能输出一个1KHZ,占空比为10%的程序怎么写啊?求高人指点1、陪定时器1的功能为特殊功能,不是普通IO&&在PERCFG这里
2、P1SEL引脚选择
3、P1DIR设为输出
4、T3CC0设置周期
5、T3CC1设置占空比
6、T3CCTL0 设置通道0
7、T3CCTL1 设置通道1
8、T3CTL设为模模式
9、用T3CTL打开即可************以下是用定时器做频率源,用定时器测量该频率的应用程序!!!***********调试STM32的定时器好几天了,也算是对STM32的定时器有了点清楚的认识了。我需要测量4路信号的频率然后通过DMA将信号的频率传输到存储器区域,手册说的很明白每个定时器有4个独立通道。然后我就想能不能将这4路信号都连接到一个定时器的4个通道上去。理论上应该是行的通的。刚开始俺使用的是TIM2的123通道,TIM4的2通道来进行频率的测量。由于没有频率发生器,所以我用tim3作为信号源,用TIM2,TIM4来进行测量就ok了(刚好4个通道了)。  请看一开始的程序,以TIM2的1,3通道为例子(2通道设置方法一样):  TIM_ICInitStructure.TIM_ICMode =TIM_ICMode_ICAP;& && && && && & //配置为输入捕获模式& && && &  TIM_ICInitStructure.TIM_Channel =TIM_Channel_1;& && && && && && &&&//选择通道1  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_ICInit(TIM2, &TIM_ICInitStructure);& &//TIM2通道1配置完毕   TIM_ICInitStructure.TIM_ICMode = TIM_ICMode_ICAP;& &&&//配置为输入捕获模式& &&&  TIM_ICInitStructure.TIM_Channel =TIM_Channel_3;& && && && && &&&//选择通道3  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_ICInit(TIM2, &TIM_ICInitStructure);& &//TIM2通道3配置完毕   以上是输入捕获配置  还需要做的工作就是(参考stm32参考手册的TIM的结构框图):     &&TIM_SelectInputTrigger(TIM2,TIM_TS_TI1FP1);& && && && && && && &//参考TIM结构图选择滤波后的TI1输入作为触发源,触发下面程序的复位     &&TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_Reset);& && && &//复位模式-选中的触发输入(TRGI)的上升沿初始化计数器,并且产生一个更新线号     &&TIM_SelectMasterSlaveMode(TIM2,TIM_MasterSlaveMode_Enable);& && &   //主从模式选择  这样我们就可以很轻松的就得到了连接在TIM2的通道1上的信号的频率,但是3通道的频率的值永远都是跳动的不准,测试了半天也没有找到根本原因,请看TIM的结构框图的一部分  红色箭头所指,这才找到原因,触发的信号源只有这四种,而通道3上的计数器的值不可能在接受到信号的上升沿时候,有复位这个动作,找到原因了。这就是3通道上的数据不停跳动的原因,要想得到信号的频率也是有办法的,可以取连续两次捕捉的值之差,这个值就是信号的周期,自己根据实际情况去算频率吧。  有以上可以得到:  stm32的TIM2的四个通道可以同时配置成输入捕捉模式,但是计算CH3,CH4信号的频率步骤有点繁琐(取前后捕捉的差值),但是他的CH1,和CH2可以轻松得到:  通道1     &&TIM_SelectInputTrigger(TIM2,TIM_TS_TI1FP1);& && && && && && && &//参考TIM结构图选择滤波后的TI1输入作为触发源,触发下面程序的复位     &&TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_Reset);& && && &//复位模式-选中的触发输入(TRGI)的上升沿初始化计数器,并且产生一个更新线号  TIMx-&CRR1的值即为信号的周期  通道2:  &&TIM_SelectInputTrigger(TIM2,TIM_TS_TI2FP2);& && && && && && &&&//参考TIM结构图选择滤波后的TI1输入作为触发源,触发下面程序的复位      &&TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_Reset);& && && &//复位模式-选中的触发输入(TRGI)的上升沿初始化计数器,并且产生一个更新线号  TIMx-&CRR2的值即为信号的周期
STM32的定时器外设功能强大得超出了想像力,STM32一共有8个都为16位的定时器。其中TIM6、TIM7是基本定时器;TIM2、TIM3、TIM4、TIM5是通用定时器;TIM1和TIM8是高级定时器。这些定时器使STM32具有定时、信号的频率测量、信号的PWM测量、PWM输出、三相6步电机控制及编码器接口等功能,都是专门为工控领域量身订做的。
& && & 基本定时器:具备最基本的定时功能,下面是它的结构:
我们来看看它的启动代码:
void TIM2_Configuration(void)
{&& 基本定时器TIM2的定时配置的结构体(包含定时器配置的所有元素例如:TIM_Period= 计数值)
& &TIM_TimeBaseInitTypeDef&&TIM_TimeBaseS
& &设置TIM2_CLK为72MHZ(即TIM2外设挂在APB1上,把它的时钟打开。)& && &
& &RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 ,ENABLE);
& &设置计数值位1000
& &TIM_TimeBaseStructure.TIM_Period=1000;
& &将TIM2_CLK为72MHZ除以72 = 1MHZ为定时器的计数频率
& &TIM_TimeBaseStructure.TIM_Prescaler= 71;
& &这个TIM_ClockDivision是设置时钟分割,这里不分割还是1MHZ的计数频率
& &TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
& &设置为向上计数模式;(计数模式有向上,向下,中央对齐1,中央对齐2,中央对齐3)
& &TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
& &将配置好的设置放进stm32f10x-tim.c的库文件中
& & TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
& &清除标志位
& & TIM_ClearFlag(TIM2,TIM_FLAG_Update);
& &使能TIM2中断
& &TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
& &使能TIM2外设& && &
& & TIM_Cmd(TIM2,ENABLE);& && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && &
& && &通用定时器:就比基本定时器复杂得多了。除了基本的定时,它主要用在测量输入脉冲的频率、脉冲宽与输出PWM脉冲的场合,还具有编码器的接口。
我们来详细讲解:如何生成PWM脉冲
通用定时器可以利用GPIO引脚进行脉冲输出,在配置为比较输出、PWM输出功能时,捕获/比较寄存器TIMx_CCR被用作比较功能,下面把它简称为比较寄存器。
这里直接举例说明定时器的PWM输出工作过程:若配置脉冲计数器TIMx_CNT为向上计数,而重载寄存器TIMx_ARR(相当于库函数写法的TIM_Period的值N)被配置为N,即TIMx_CNT的当前计数值数值X在TIMxCLK时钟源的驱动下不断累加,当TIMx_CNT的数值X大于N时,会重置TIMx_CNT数值为0重新计数。
而在TIMxCNT计数的同时,TIMxCNT的计数值X会与比较寄存器TIMx_CCR预先存储了的数值A进行比较,当脉冲计数器TIMx_CNT的数值X小于比较寄存器TIMx_CCR的值A时,输出高电平(或低电平),相反地,当脉冲计数器的数值X大于或等于比较寄存器的值A时,输出低电平(或高电平)。
如此循环,得到的输出脉冲周期就为重载寄存器TIMx_ARR存储的数值(N+1)乘以触发脉冲的时钟周期,其脉冲宽度则为比较寄存器TIMx_CCR的值A乘以触发脉冲的时钟周期,即输出PWM的占空比为A/(N+1)。
如果不想看的可以直接看我标注的红色字体,就大体可以理解。
下面我们来编写具体代码和讲解:
void TIM3_GPIO_Config(void)
{配置TIM3复用输出PWM的IO
&&GPIO_InitTypeDefGPIO_InitS
&&打开TIM3的时钟
&&RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
&&打开GPIOA和GPIOB的时钟
&&RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA| RCC_APB2Periph_GPIOB, ENABLE);
&&配置PA6.PA7的工作模式
&&GPIO_InitStructure.GPIO_Pin=&&GPIO_Pin_6 |GPIO_Pin_7;
&&GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF_PP;& && &
&&GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;
&&GPIO_Init(GPIOA,&GPIO_InitStructure);
&&配置PB0.PB1的工作模式
&&GPIO_InitStructure.GPIO_Pin=&&GPIO_Pin_0 |GPIO_Pin_1;
&&GPIO_Init(GPIOB,&GPIO_InitStructure);
void TIM3_Mode_Config(void)
& && & TIM_TimeBaseInitTypeDef&&TIM_TimeBaseS//初始化TIM3的时间基数单位
& && & TIM_OCInitTypeDef&&TIM_OCInitS//初始化TIM3的外设
& && &&&u16 CCR1_Val= 500;& && &
& && &&&u16 CCR2_Val= 375;
& && &&&u16 CCR3_Val= 250;
& && &&&u16 CCR4_Val= 125;//PWM信号电平跳变值(即计数到这个数值以后都是低电平之前都是高电平)
&&TIM3的时间基数单位设置(如计数终止值:999,从0开始;计数方式:向上计数)& && &
&&TIM_TimeBaseStructure.TIM_Period= 999;& && &
&&TIM_TimeBaseStructure.TIM_Prescaler= 0;& && && &
&&TIM_TimeBaseStructure.TIM_ClockDivision= TIM_CKD_DIV1 ;& && &
&&TIM_TimeBaseStructure.TIM_CounterMode= TIM_CounterMode_Up;
&&TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
&&TIM3的外设的设置
&&TIM_OCInitStructure.TIM_OCMode= TIM_OCMode_PWM1;& && &//TIM脉冲宽度调制模式1& &
&&TIM_OCInitStructure.TIM_OutputState= TIM_OutputState_E//这个暂时不知道,stm32固件库里没有搜到。应该是定时器输出声明使能的意思& && &
&&TIM_OCInitStructure.TIM_Pulse =CCR1_V//设置了待装入捕获比较寄存器的脉冲值& && &
&&TIM_OCInitStructure.TIM_OCPolarity= TIM_OCPolarity_H //TIM输出比较极性高
&&TIM_OC1Init(TIM3,&TIM_OCInitStructure);
&&TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);//使能或者失能TIMx在CCR1上的预装载寄存器
&&下面3路PWM输出和上面的一样不再解说
&&TIM_OCInitStructure.TIM_OutputState= TIM_OutputState_E
&&TIM_OCInitStructure.TIM_Pulse =CCR2_V& && &
&&TIM_OC2Init(TIM3,&TIM_OCInitStructure);& && &
&&TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);
&&TIM_OCInitStructure.TIM_OutputState= TIM_OutputState_E
&&TIM_OCInitStructure.TIM_Pulse =CCR3_V& && &
&&TIM_OC3Init(TIM3,&TIM_OCInitStructure);& && &
&&TIM_OC3PreloadConfig(TIM3,TIM_OCPreload_Enable);
&&TIM_OCInitStructure.TIM_OutputState= TIM_OutputState_E
&&TIM_OCInitStructure.TIM_Pulse =CCR4_V& && &
&&TIM_OC4Init(TIM3,&TIM_OCInitStructure);& && &
&&TIM_OC4PreloadConfig(TIM3,TIM_OCPreload_Enable);
&&TIM_ARRPreloadConfig(TIM3,ENABLE);& && & //使能TIM3重载寄存器ARR& && && &&&
&&TIM_Cmd(TIM3,ENABLE);//使能TIM3& && && &
太累了边看边写都这个点了日0:24:13在自己床上写的。下面是看看我们程序达到的4路PWM的效果:
可以看到明显占空比不同的4路pwm波。
这一节终于讲完,个人觉得敲一遍代码学起来还是蛮容易懂的。希望看到的人也能搞懂。
最后补充一点pwm具体能干什么?&&特别是对广大电子DIY爱好者的应用:
智能小车的电机控制:我们可以利用pwm来控制我们的智能小车的车速;
机器人:给“机器人关节”舵机周期一定(我以前玩过具体多少毫秒忘记了)pwm波就可以控制舵机的转动角度了;
呼吸灯:输入不同的pwm波就可以达到明暗渐明渐暗的效果。
还有别的应用大家一起发挥想象力给予补充。我们可以一起交流,希望大家支持。
Powered by

我要回帖

更多关于 stm32f030f4p6 pwm 的文章

 

随机推荐