微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 基于stm32的PWM输出

基于stm32的PWM输出

时间:10-02 整理:3721RD 点击:
在做stm32的PWM输出时,我参照例程,把原来的TIM1-CH1改成了TIM3-CH1,也就是PA.6端口,程序里面涉及到定时器的参数和函数名都改过了,可是在PA.6得不到PWM波,我是用PA.6端口驱动LED的,朱成西循环改变占空比值,LED却是一直常亮,而且亮度不增不减,求大神指教

  1. void TIM3_PWM_Init(u16 arr,u16 psc)
  2. {  
  3.          GPIO_InitTypeDef GPIO_InitStructure;
  4.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  5.         TIM_OCInitTypeDef  TIM_OCInitStructure;

  6.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//
  7.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);  //使能GPIO外设时钟使能
  8.                                                                                     

  9.    //设置该引脚为复用输出功能,输出TIM3 CH1的PWM脉冲波形
  10.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //TIM_CH1
  11.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
  12.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  13.         GPIO_Init(GPIOA, &GPIO_InitStructure);

  14.        
  15.         TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值         80K
  16.         TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  不分频
  17.         TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
  18.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
  19.         TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位


  20.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
  21.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  22.         TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
  23.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
  24.         TIM_OC1Init(TIM3, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx

  25.   TIM_CtrlPWMOutputs(TIM3,ENABLE);        //MOE 主输出使能       

  26.         TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);  //CH1预装载使能         
  27.        
  28.         TIM_ARRPreloadConfig(TIM3, ENABLE); //使能TIMx在ARR上的预装载寄存器
  29.        
  30.         TIM_Cmd(TIM3, ENABLE);  //使能TIM3

  31.    
  32. }

复制代码


这是定时器PWM初始化函数,

  1. void LED_Init(void)
  2. {

  3. GPIO_InitTypeDef  GPIO_InitStructure;
  4.        
  5. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIO3A, ENABLE);         
  6.        
  7. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;                                 
  8. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                
  9. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;               
  10. GPIO_Init(GPIOA, &GPIO_InitStructure);                                         
  11. //GPIO_SetBits(GPIOA,GPIO_Pin_6);                                                 

  12. // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;                             
  13. // GPIO_Init(GPIOD, &GPIO_InitStructure);                                 
  14. // GPIO_SetBits(GPIOD,GPIO_Pin_2);                                                
  15. }

复制代码


这是端口初始化

  1. int main(void)
  2. {       
  3.         //u16 led0pwmval=0;   
  4.         //u8 dir=1;       
  5.         delay_init();                     //延时函数初始化          
  6.         LED_Init();                          //初始化与LED连接的硬件接口
  7.         TIM3_PWM_Init(899,0);//不分频。PWM频率=72000/(899+1)=80Khz
  8.            while(1)
  9.         {
  10.                 delay_ms(10);         
  11.                 if(dir)
  12.                 {
  13.                         led0pwmval++;
  14.                         if(led0pwmval>300)
  15.                                 dir=0;
  16.                 }
  17.                 else
  18.                 {
  19.                 led0pwmval--;
  20.                 if(led0pwmval==0)
  21.                         dir=1;         
  22.                 }                                                    
  23.         TIM_SetCompare1(TIM3,0);          
  24. }

  25. }

复制代码


主函数,不断改变占空比循环,

定时器初始化函数第六行多打了一个3

果然新人没人理

自顶自顶

你要根据对应的表   查看你所驱动的TIM3模块式通道几      不能你想设置哪个通道就设置那个   祝你好运

这行语句不对!比较值是随着led0pwmval这个变量变化而变化的.


我是根据原理图来的,通道口我确定没错的

我想改的极端一点,就先把循环隐掉了,看看输出是否为占空比为0的pwm

将PWM初始化函数的20行参数改为TIM_CKD_div1,再在主函数里面隐掉LED初始化函数就行了,


就请问大神改了这两处怎么就行了

谢谢小编辛苦了哦,赞一个。

具体可百度颖展ic芯片进官网查询一下

大哥,你的占空比调节函数是个什么鬼

最后一句有问题,TIM_SetCompare1(TIM3,0),你设置为0,相当于占空比为0.一直是低电平,当然常亮

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top