×
单片机 > 单片机程序设计 > 详情

STM32PWM输出实验

发布时间:2020-08-26 发布时间:
|
一、PWM简介
要使STM32的通用定时器TIMx产生PWM输出,除了定时器中断实验中提到的寄存器外,还会用到另外三个寄存器,这三个寄存器是:捕获/比较模式寄存器(TIMx_CCMR1/2)、捕获/比较使能寄存器(TIMx_CCER)、捕获/比较寄存器(TIMx_CCR1~4)。
首先是捕获/比较模式寄存器(TIMx_CCMR1/2),该寄存器总共有两个,TIMx_CCMR1和TIMx_CCMR2。TIMx_CCMR1控制CH1和2,而TIMx_CCMR2控制CH3和4。
在这章用到该寄存器的模式设置位OCxM,此部分由3位组成。总共可以配置为7种模式,这里我们使用的是PWM模式,所以这三位设置为110/111。这两种PWM模式的区别就是输出电平的极性相反。
接下来介绍捕获/比较使能寄存器(TIMx_CCER),该寄存器控制着各个输入输出通道的开关。这里用到CC2E位,将该位置1即可。
最后,介绍捕获/比较寄存器(TIMx_CCR1~4),该寄存器一共有4个,对应了4个通道CH1~4。下面以TIMx_CCR1为例,在输出模式下,该寄存器的值与CNT的值比较,根据比较结果产生相应动作。利用这一点我们就可以通过修改寄存器的值来控制脉冲宽度了。
二、PWM输出实验步骤
1.开启TIM3时钟及输出通道对应的GPIO口时钟。
点击(此处)折叠或打开
  1. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  2. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
2.初始化TIM3,设置TIM3的ARR和PSC。
点击(此处)折叠或打开
  1. TIM_TimeBaseInitStruct.TIM_Period=arr;    //设置在自动重装载周期值
  2. TIM_TimeBaseInitStruct.TIM_Prescaler=psc;    //设置预分频值
  3. TIM_TimeBaseInitStruct.TIM_ClockDivision=0;    //设置时钟分割:TDTS=Tck_tim
  4. TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;    //TIM向上计数模式
  5. TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);
3.设置TIM3_CH2的PWM模式,使能TIM3的CH2输出。
点击(此处)折叠或打开
  1. TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM2;
  2. TIM_OCInitStruct.TIM_Pulse = 500;
  3. TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;
  4. TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High;
  5. TIM_OC1Init(TIM3,&TIM_OCInitStruct);
4.使能TIM3。
点击(此处)折叠或打开
  1. TIM_Cmd(TIM3,ENABLE);
5.修改TIM3_CCR2来控制占空比。
点击(此处)折叠或打开
  1. TIM_SetCompare1(TIM3,led0pwmval); 
三、主程序
点击(此处)折叠或打开
  1. #include"pwm.h"
  2. #include"sys.h"
  3. #include"delay.h"
  4. #include"led.h"
  5. #include"usart.h"
  6.  
  7. int main(void)
  8. {
  9. u16 led0pwmval=0;
  10. u8 dir=1;
  11. SystemInit();
  12. TIM3_PWM_Init(899,0);
  13. while(1)
  14. {
  15. // delay_ms(10);
  16. if(dir) led0pwmval++;
  17. else led0pwmval--;
  18. if(led0pwmval>300) dir=0;
  19. if(led0pwmval==0) dir=1;
  20. TIM_SetCompare1(TIM3,led0pwmval); 
  21. }
  22. }
 
四、总结
1、主程序中delay_ms(10)添加后不能正常运行。
2、原理图中的TIM3_CH2与实际运行不符,原理图上应该是标错了。


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
AVR单片机语音识别电路模块设计