STM32定时器产生PWM彻底应用_第1页
STM32定时器产生PWM彻底应用_第2页
STM32定时器产生PWM彻底应用_第3页
STM32定时器产生PWM彻底应用_第4页
STM32定时器产生PWM彻底应用_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、这次学习STM32花了很长时间,一个礼拜多,也有颇多收获,学习过程也 有颇多曲折。这次的任务是:用 STM32的一个定时器在四个通道上产生四路频 率可调占空比可调的 PWM 波。看到这个题,我先看STM32的数据手册,把STM32的定时器手册看完就花 了一天,但是看了一遍任然不知道所云,就看库函数,略有点理解,就想一哈 把这个程序调出来,于是就花了一天多时间仿照网上别人的程序来写,花了一 天多写出来调试,结果行不通,做了无用功,于是静下心来想想,还是一步一 步的来。我先用STM32的通用定时器用PWM模式产生四路相同占空比,不同频率 的 PWM 波,配置如下:RCC_APB1PeriphClo

2、ckCmd(RCC_APB1Periph_TIM2,ENABl使能/ TIM2 时钟 TIMn ternalClockCo nfig(TIM2); 使用内部时钟TIM_BaseInitStructure.TIM_Prescaler=3; /设置 TIM 时钟频率除数的预分频值 TIM_Basel nitStructure.TIM_Cou nterMode二TIM_Cou nterMode_Up; 选择计数器模 式TIM_BaseInitStructure.TIM_Period=1799;设置下一个更新事件装入活动的自 动重装载寄存器周期的值TIM_BaseI nitStructure.TIM_

3、ClockDivisio n=0;/设 置时钟分割TIM_TimeBaseInit(TIM2,&TIM_BaseInitStructure);/ 通道 1TIM_OCI ni tStructure.TIM_OCMode二TIM_OCMode_PWM1;/选择定时器模式 TIM_OCI ni tStructure.TIM_OutputState二TIM_OutputState_E nable;/选择输出比较状 态 TIM_OCInitStructure.TIM_OutputNState二TIM_OutputNState_Disable;/选择互补 输出比较状态TIM_OC In itStruct

4、ure.TIM_Pulse二CCR1_Val;设置了待装入捕获比较器的脉冲 值 TIM_OCInitStructure.TIM_OCPolarity二TIM_OCPolarity_High;设置输出极性 TIM_OC In itStructure.TIM_OCNPolarity二TIM_OCNPolarity_Low;设 置互补输出极性TIM_OCI ni tStructure.TIM_OCIdleState二TIM_OCIdleState_Set 选 择空闲状态下得非 工作状态TIM_OCI nitStructure.TIM_OCNIdleState二TIM_OCNIdleState_Res

5、et选择互补 空闲状态下得非工作状态TIM_OC1Init(TIM2,&TIM_OCInitStructure);TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);/ 通道 2TIM_OCI ni tStructure.TIM_Pulse二CCR2_Val;设置了待装入捕获比较器的脉冲 值 TIM_OC2Init(TIM2,&TIM_OCInitStructure);TIM_OC2PreloadConfig(TIM2,TIM_OCPreload_Enable);/ 通道 3TIM_OCI ni tStructure.TIM_Pulse二CCR3_

6、Val;设置了待装入捕获比较器的脉冲 值 TIM_OC3Init(TIM2,&TIM_OCInitStructure);TIM_OC3PreloadConfig(TIM2,TIM_OCPreload_Enable);/ 通道 4TIM_OCI ni tStructure.TIM_Pulse二CCR4_Val;设置了待装入捕获比较器的脉冲 值 TIM_OC4Init(TIM2,&TIM_OCInitStructure);TIM_OC4PreloadConfig(TIM2,TIM_OCPreload_Enable);TIM_Cmd(TIM2, ENABLE);TIM_CtrlPWMOutputs(

7、TIM2,ENABLE);用 pwm 模式输出的频率和占空比是固定的,不可调,要想输出频率可调, 占空比可调,必须得使用比较输出模式。这点资料是在STM32全国巡回研讨会上看到的,如图:所以,接下来我就写了一个程序通过输出比较模式产生一路 PWM 波,这个波的频率和占空比都由自己确定,函数配置如下:TIM_BaseInitStructure.TIM_Prescaler=3; /设置 TIM 时钟频率除数的预分频值 (18M)TIM_Basel nitStructure.TIM_Cou nterMode二TIM_Cou nterMode_Up; 选择计数 器模式TIM_BaseInitStruc

8、ture.TIM_Period=1800;/设置下一个更新事件装入活动 的自动重装载寄存器周期的值TIM_BaseI nitStructure.TIM_ClockDivisio n=0;/设 置时钟分割TIM_TimeBaseInit(TIM2,&TIM_BaseInitStructure);/ 通道 1TIM_OCI ni tStructure.TIM_OCMode二TIM_OCMode_Toggle;选 择定时器模式 TIM_OCI ni tStructure.TIM_OutputState二TIM_OutputState_E nable;/选择输出比较状 态 TIM_OCInitStru

9、cture.TIM_OutputNState二TIM_OutputNState_Disable;/选择互补 输出比较状态TIM_OC In itStructure.TIM_Pulse二CCR1_Val1;设置了待装入捕获比较器的脉 冲值 TIM_OCInitStructure.TIM_OCPolarity二TIM_OCPolarity_High;设置输出极性 TIM_OC In itStructure.TIM_OCNPolarity二TIM_OCNPolarity_Low;设 置互补输出极性 TIM_OCI ni tStructure.TIM_OCIdleState二TIM_OCIdleSta

10、te_Set 选 择空闲状态下得非 工作状态TIM_OCI nitStructure.TIM_OCNIdleState二TIM_OCNIdleState_Reset选择互补 空闲状态下得非工作状态TIM_OC1Init(TIM2,&TIM_OCInitStructure);TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Disable);TIM_ARRPreloadConfig(TIM2,ENABLE);TIM_ITConfig(TIM2,TIM_IT_CC1,ENABLE);TIM_Cmd(TIM2,ENABLE);void TIM2_IRQHandler(

11、void)TIM_ClearITPendingBit(TIM2,TIM_IT_CC1);if(n=1)n=0;TIM_SetCompare1(TIM2,CCR1_Val2);elsen=1;TIM_SetCompare1(TIM2,CCR1_Val1);通过改变比较寄存器(CCR1中的值,改变PWM的占空比,在每次匹配 中断中改变CCR1的值。上面程序实现的是产生一路频率为 10K占空比为40%的 PWM 波。有了上面的思想我就想产生四路不同频率不同占空比的PWM波,经过反复思考光配函数似乎不能实现,在网上去查了的,很多网友也说不能实现,有一 个网友给了一个提示:软件模拟。刚开始没明白什么意思

12、,于是还是自己继续 配置库函数,在这个过程中一直有两个疑问:每次中断中,CCR寄存器的值都在循环的增加,CCR的寄存器不可能是无限大吧?就算是无限大,计数器也不 是无限大呀,他只能记到 65535。初步确定使用匹配中断不行,我有想过同时使 用溢出中断和匹配中断,但这样四路 PWM波只能是固定的,频率和占空比不能 调。大概说一下怎样用溢出中断和匹配中断实现四路固定的 PWM 波,把计数器 寄存器(CNT的值装最大周期的那个PWM波,当一次计数完成算一下三路小 点周期数,在匹配中断中对应的设个变量,CCF就改变几次,溢出中断来了就再次给计数器装初值,同时四个比较寄存器从装初值,这样很麻烦,理论上可

13、 以实现,但我考虑到最终不能实现我的要求,就没有去验证。所以产生四路频 率可调占空比可调,用一个定时器似乎不能实现,就一直卡到这里,我又在想 飞哥说能实现,就肯定能实现,我又在网上找资料,还是没找到,只是有人题 四路,软模拟,于是我就思考用软模拟实现,最后在一个师兄的指点下,确实 用软件模拟一个中间比较寄存器能实现,思路大概是这样子的,首先让比较寄 存器装满,也就是最大值( 65535),然后通过改变模拟比较寄存器的值,每次 匹配中断只需把模拟比较寄存器的值去比较就行,具体方案看程序。unsignedcharCnt4;/ 一个数组,这个数组的每个元素对应一个通道,用来 判断装 PWM 得高电平

14、还是低电平数unsigned intT4;/ 周期数组unsigned intR4;/ 模拟的比较寄存器数组,一样的每个通道对应一个数组元素 unsigned intRh4;/ 模拟的 PWM 高电平比较寄存器unsigned intRl4; / 模拟的 PWM 低电平比较寄存器unsigned char F4;/ 占空比数组unsigned int CCR1,CCR2,CCR3,CCR4;void Init(void)unsigned char i = 0;for(i = 0; i 4; i+)Cnti= 0;Ti= 0;Ri= 0;Rhi = 0;Rli = 0;Fi= 0;/t 的范围为

15、( 065536)T0 = 450;/F=40KT1 = 600;/F=30KT2 = 900;/F=20KT3 = 1800;/F=10KF(占空比)的范围为(0100)F0 = 40;F1 = 30;F2 = 20;F3 = 10;for(i = 0; i 65535)R0=R0-65535;CCR1=R0; TIM_SetCompare1(TIM3,CCR1);if(TIM_GetITStatus(TIM3,TIM_IT_CC2)!=RESET)TIM_ClearITPendingBit(TIM3,TIM_IT_CC2); Cnt1=(Cnt1)&0x01;if(Cnt1=0x01)R1

16、+=Rl1;elseR1 += Rh1;if(R165535)R1=R1-65535;CCR2=R1;TIM_SetCompare2(TIM3,CCR2);if(TIM_GetITStatus(TIM3,TIM_IT_CC3)!=RESET)TIM_ClearITPendingBit(TIM3,TIM_IT_CC3);Cnt2=(Cnt2)&0x01; if(Cnt2=0x01)R2+=Rl2;elseR2 += Rh2;if(R265535)R2=R2-65535;CCR3=R2; TIM_SetCompare3(TIM3,CCR3);if(TIM_GetITStatus(TIM3,TIM_IT_CC4)!=RESET)TIM_ClearITPendingBit(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论