打印
[STM32F1]

STM32F103 PWM输出的奇怪问题

[复制链接]
2437|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ziranren|  楼主 | 2016-3-28 17:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
PWM输出在中央对齐模式下,当设置为PWM1时,可以正常输出,输出的有效电平在一个PWM周期的两端,即在计数器加阶段CNT<CCR时输出有效,
    在计数器减阶段CNT<CCR时输出有效,这样得到的PWM第一个输出是不连续的半个PWM周期。代码如下:

    //设置TIME计时值及计时方式,死区时间,
        TIM1->CR1        |= 0x0080;                                //自动重装使能,时钟分频因子为0,TDTS=Tck
        TIM1->CR1        &= 0xFF8F;                                //0=计数期向上计数,
        TIM1->CR1        |= 0x0060;                                //3=中央对齐模式
        TIM1->ARR        = PWM_PERIOD_T;                        //设置自动重装值
        TIM1->PSC        = PWM_PERIOD_PSC;                //设置计数器与分频寄存器
        TIM1->BDTR        |= 0x0040;                                //设置死区时间0.88uS,72MHz(T=0.0138uS),0.88uS/0.0138=36,36=0x24
    //设置输出使能,输出有效电平和输出空闲电平
        TIM1->CCER        &= 0xFAAA;                                //初始化时关闭输出使能,在启动时或之后相位变化时再设置使能输出的引脚
        TIM1->CCER        &= 0x0DDD;                                //P高边MOS输出高电平导通,CCER.9,5,1设置为0,注:此处逻辑为反相
        TIM1->CCER        |= 0x0888;                                //N低边MOS输出低电平导通,CCER.11,7,3设置为1,注:此处逻辑为反相
        TIM1->CR2        &= 0x2AFF;                                //P高边MOS输出空闲为低电平,CR2.12,10,8设置为0,注:此处逻辑为同相
        TIM1->CR2        |= 0x2A00;                                //N低边MOS输出空闲为高电平,CR2.13,11,9设置为1,注:此处逻辑为同相
        TIM1->BDTR        |= (1<<11);                                //OSSR设置为1,保证CCxE,CCxNE为0禁止输出时,OCx,OCxN输出CCxP,CCxNP电平
        //边沿对齐模式下,TIM_CNT<TIM_CCR时输出有效电平,有效电平在前,无效电平在后
        //中央对齐模式下,TIM_CNT<TIM_CCR时输出有效电平,第一个有效电平出现半个有效波形输出
        //设置捕获,比较,输出模式
        TIM1->CCMR1        |= 0x6060;                                //设置输出比较模式为PWM模式1,TIM1_CNT<TIM1_CCRn时为有效电平,反之为死区电平
        TIM1->CCMR2        |= 0x0060;
       
        我想得到中间输出有效的PWM,即第一个PWM输出有效电平在中间,而不是两个半个有效电平分列两端,
        于是将PWM模式1改为PWM模式2,CNT>CCR输出有效,但实际上没有输出,代码如下:
        //设置TIME计时值及计时方式,死区时间,
        TIM1->CR1        |= 0x0080;                                //自动重装使能,时钟分频因子为0,TDTS=Tck
        TIM1->CR1        &= 0xFF8F;                                //0=计数期向上计数,
        TIM1->CR1        |= 0x0060;                                //3=中央对齐模式
        TIM1->ARR        = PWM_PERIOD_T;                        //设置自动重装值
        TIM1->PSC        = PWM_PERIOD_PSC;                //设置计数器与分频寄存器
        TIM1->BDTR        |= 0x0040;                                //设置死区时间0.88uS,72MHz(T=0.0138uS),0.88uS/0.0138=36,36=0x24
        //设置输出使能,输出有效电平和输出空闲电平
        TIM1->CCER        &= 0xFAAA;                                //初始化时关闭输出使能,在启动时或之后相位变化时再设置使能输出的引脚
        TIM1->CCER        &= 0x0DDD;                                //P高边MOS输出高电平导通,CCER.9,5,1设置为0,注:此处逻辑为反相
        TIM1->CCER        |= 0x0888;                                //N低边MOS输出低电平导通,CCER.11,7,3设置为1,注:此处逻辑为反相
        TIM1->CR2        &= 0x2AFF;                                //P高边MOS输出空闲为低电平,CR2.12,10,8设置为0,注:此处逻辑为同相
        TIM1->CR2        |= 0x2A00;                                //N低边MOS输出空闲为高电平,CR2.13,11,9设置为1,注:此处逻辑为同相
        TIM1->BDTR        |= (1<<11);                                //OSSR设置为1,保证CCxE,CCxNE为0禁止输出时,OCx,OCxN输出CCxP,CCxNP电平
        //边沿对齐模式下,TIM_CNT>TIM_CCR时输出有效电平,有效电平在后,无效电平在前
        //中央对齐模式下,TIM_CNT>TIM_CCR时输出有效电平,有效输出背靠背,不出现半个有效波形输出,占空比需要反相
        //设置捕获,比较,输出模式,中央对齐模式,两头输出无效电平,中间输入有效电平
        TIM1->CCMR1        |= 0x7070;                                //设置输出比较模式为PWM模式2,TIM1_CNT>TIM1_CCRn时为有效电平,反之为死区电平
        TIM1->CCMR2        |= 0x0070;

        求高手赐教
沙发
ziranren|  楼主 | 2016-3-28 18:15 | 只看该作者
还有一个问题请教。
使用中间对齐模式时,要得到10KHz的PWM,那么定时器的频率要设置为20kHz,并需要开定时器中断,如何才能将定时器中断做到和PWM频率相同的10KHz呢?

使用特权

评论回复
板凳
ziranren|  楼主 | 2016-3-29 10:27 | 只看该作者
坐等高手解答。顶一下别沉了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

181

帖子

0

粉丝