PWM怎么一直输出低电平啊

[复制链接]
 楼主| MTCN2013 发表于 2016-7-10 21:35 | 显示全部楼层 |阅读模式

  1. #include "pwm.h"
  2. void TIM2_PWM_Init(u16 arr,u16 psc)
  3. {
  4.         GPIO_InitTypeDef GPIO_InitStruct;
  5.         TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
  6.         TIM_OCInitTypeDef TIM_OCInitStruct;
  7.         
  8.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
  9.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO ,ENABLE);
  10.         
  11.   GPIO_InitStruct.GPIO_Pin=GPIO_Pin_1;                        //PA1
  12.   GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;                //50MHZ的输出速度
  13.   GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;                  //复用推挽输出
  14.   GPIO_Init(GPIOA,&GPIO_InitStruct);

  15.   TIM_TimeBaseInitStruct.TIM_Prescaler=arr;                        //设置作为时钟频率除数的预分频值
  16.   TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;   //设置为向上计数
  17.   TIM_TimeBaseInitStruct.TIM_Period=psc;                               //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
  18.   TIM_TimeBaseInitStruct.TIM_ClockDivision=0;           //设置时钟分割
  19.   TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);

  20.   TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;              //设置为PWM模式1
  21.   TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;  //比较输出使能1
  22.   TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High;       //TIM比较输出极性高
  23.   TIM_OCInitStruct.TIM_Pulse=0;
  24.   TIM_OC2Init(TIM2,&TIM_OCInitStruct);

  25.   TIM_OC2PreloadConfig(TIM2,TIM_OCPreload_Enable);  //使能预装载值

  26.   TIM_Cmd(TIM2, ENABLE);       //使能TIM2

  27.   TIM_SetCompare2(TIM2,0);   
  28. }        


songlaijun 发表于 2016-7-13 14:09 | 显示全部楼层
TIM_SetCompare2(TIM2,0);
应该是这句的问题。
manaok12345 发表于 2016-7-14 09:40 | 显示全部楼层
你最后一句写的有问题,  TIM_SetCompare2(TIM2,0);    你里面写的0不就一直输出低电平了么?
叶覃 发表于 2016-7-14 23:08 | 显示全部楼层
你没有改变电平跳变的值,程序的结果无非就是一直高或者一直低。给他设定一个改变的值就可以了。
huafei123 发表于 2016-7-15 11:27 | 显示全部楼层
可以把  TIM_SetCompare2放在主函数然后一直改变,你就会得到呼吸灯的效果了
mdk55555 发表于 2016-7-16 22:04 | 显示全部楼层
应该是设置好占空比的话,启动pwm,会自动输出需要的波形的。是不是没设置好呢?
haokeer 发表于 2016-7-18 17:36 | 显示全部楼层
  1. 看一看我找的初始化函数,和你的不一样的
  2. void TIM3_Config(void)  
  3. {  
  4.     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;  
  5.     TIM_OCInitTypeDef  TIM_OCInitStructure;  
  6.     /* PWM信号电平跳变值 */  
  7.     u16 CCR1= 36000;         
  8.     u16 CCR2= 36000;  
  9.     /*PCLK1经过2倍频后作为TIM3的时钟源等于72MHz*/  
  10.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);  
  11.     /* Time base configuration */                                            
  12.     TIM_TimeBaseStructure.TIM_Period =0xEA5F;  
  13.     TIM_TimeBaseStructure.TIM_Prescaler = 2;                                    //设置预分频:预分频=2,即为72/3=24MHz  
  14.     TIM_TimeBaseStructure.TIM_ClockDivision = 0;                                //设置时钟分频系数:不分频  
  15.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;                 //向上计数溢出模式  
  16.     TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);  
  17.     /* PWM1 Mode configuration: Channel1 */  
  18.     TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                           //配置为PWM模式1  
  19.     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;               
  20.     TIM_OCInitStructure.TIM_Pulse = CCR1;                                       //设置跳变值,当计数器计数到这个值时,电平发生跳变  
  21.     TIM_OCInitStructure.TIM_OCPolarity =TIM_OCPolarity_High;                    //当定时器计数值小于CCR1时为高电平  
  22.     TIM_OC1Init(TIM3, &TIM_OCInitStructure);                                    //使能通道1      
  23.     TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);  
  24.     /* PWM1 Mode configuration: Channel2 */  
  25.     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  
  26.     TIM_OCInitStructure.TIM_Pulse = CCR2;                                       //设置通道2的电平跳变值,输出另外一个占空比的PWM  
  27.     TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;                    //当定时器计数值小于CCR2时为低电平
  28.     TIM_OC2Init(TIM3, &TIM_OCInitStructure);                                    //使能通道2  
  29.     TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  
  30.     TIM_ARRPreloadConfig(TIM3, ENABLE);                                         //使能TIM3重载寄存器ARR  
  31.     /* TIM3 enable counter */  
  32.     TIM_Cmd(TIM3, ENABLE);                                                      //使能TIM3  
  33. }
xiaolong12 发表于 2016-7-19 15:52 | 显示全部楼层
应该和这句函数TIM_SetCompare2(TIM2,0);  你一直到0的时候就溢出,相当于pwm不起作用了。
喵喵小星人 发表于 2016-7-19 19:50 | 显示全部楼层
你这是设置为向上计数,所以不起作用。设置成向下计数溢出,就能有规律的输出了。
maninman1981 发表于 2016-7-20 22:07 | 显示全部楼层
最后一个,比较值的设置,应该放在定时器开启之前。这样才能自动输出需要的波形。
rmbass 发表于 2016-7-21 09:27 | 显示全部楼层
最后一个函数的使用,我见别人都是这么用的
  capture1 = TIM_GetCapture1(TIM2);
  TIM_SetCompare1(TIM2,capture1 + CCR1_Val);
yysforever 发表于 2016-7-22 10:54 | 显示全部楼层
CCR1的值不断的在增加。一定要设置ARR为65535;利用CCR1的自动溢出,真是亏ST想的出来。
冰是睡着的冰 发表于 2016-7-22 21:53 | 显示全部楼层
TIM_SetCompare2(TIM3,led0pwmval);通过这个函数可以往捕获/ 比较寄存器2(TIM3_CCR2)里面写值,当定时器3更新的时候,把led0pwmval写入到TIM3_CCR2里面,然后定时器就会不停的把TIM3_CNT寄存器的值和TIM3_CCR2寄存器里面的值进行比较,假如你设置的是向上计数模式,并且通过这个函数(TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高)把TIM3的输出/比较极性设置为高的时候,那么此时如果TIM3_CNT<TIM3_CCR2那么输出就是低电平,如果TIM3_CNT>=TIM3_CCR2那么输出就是高电平,所以在这里(//输出极性:TIM输出比较极性高)的意思是TIM3_CNT>=TIM3_CCR2时候的极性为高
yesherecn 发表于 2016-7-23 11:56 | 显示全部楼层
TIM_SetCompare2(TIM2,0);   这个0的取值有问题,你改成其他取值试试。
playergatsby 发表于 2016-7-23 22:47 | 显示全部楼层
PWM占空比的设置,应该放在定时器开启之前的。
 楼主| MTCN2013 发表于 2017-4-18 22:29 | 显示全部楼层
manaok12345 发表于 2016-7-14 09:40
你最后一句写的有问题,  TIM_SetCompare2(TIM2,0);    你里面写的0不就一直输出低电平了么? ...

对,应该就是这个的。这个的影响,一直输出低电平。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

155

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部