OCX和OCXREF究竟是什么关系

2019-07-21 05:12发布

大家好:
     请问OCX和OCXREF究竟是什么关系?   
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
36条回答
正点原子
1楼-- · 2019-07-21 06:25
        在《STM32参考手册》V10的第266页,图123和图124之间有这么一句话:输出部分产生一个中间波形OCxRef(高有效)作为基准,链的末端决定最终输出信号的极性。
        然后,我们在266页还可以看到图125的通道输出部分框图,如下图所示:

        从图中可以看出,OCxREF其实就是OCx输出的中间状态,这里最后那个输出使能电路比较好理解,其实就是通过CCxE来控制的一个开关。我们要是能使出PWM之类的波形,则必须使能CCxE位的。但是CC1P这里不是很好理解,尤其是这个图,看起来怪怪的,像个加法器。我们再从《参考手册》的第292页找到这个图:


        上图告诉我们CCxP是用来控制极性的,默认设置(复位后)为0,也就是高电平有效,而如果设置该位,则为低电平有效。通过实验我发现,这里的有效电平,其实就是在PWM输出的有效电平(匹配时的电平),比如我设置PWM某个时候的比较值为0,此时PWM会输出100%占空比的有效电平,此时,我们可以看到OCx输出是一个固定的电平,这个电平,其实就是你设置的CC1P的状态。当设置OCxP的值为0的时候,100%占空比输出是高电平,当设置OCxP为1的时候,100%占空比输出是低电平。从而控制了输出极性。
        在开发板的实验8上稍作修改得到仿真代码,仅仅修改了main函数,如下:
//Mini STM32开发板扩展实例 7
//PWM输出 实验
//正点原子@ALIENTEK
//2010.12.25 
  

int main(void)
{    
  Stm32_Clock_Init(9); //系统时钟设置
 delay_init(72);      //延时初始化
 uart_init(72,9600);  //串口初始化
 LED_Init();      //初始化与LED连接的硬件接口
 WM_Init(90,0);  //不分频。PWM频率=72000/900=8Khz
    //可以通过注释:TIM3->CCER|=1<<5;这句,来观看结果,此结果完全软件仿真即可看到。
 //在波形观察里面新建一个PORTA.7的信号,就能看到修改TIM3->CCER第5位的值产生的结果了。
 while(1)
 { 
  TIM3->CCER|=1<<5;   //低电平有效      
   delay_ms(10);          
  LED0_PWM_VAL=45;   
   delay_ms(10); 
   LED0_PWM_VAL=0;  
  delay_ms(10); 
  LED0_PWM_VAL=45;   
  delay_ms(10); 
   LED0_PWM_VAL=0;   
  TIM3->CCER&=~(1<<5);//高电平有效       
   delay_ms(10);          
  LED0_PWM_VAL=45;   
   delay_ms(10); 
   LED0_PWM_VAL=0;  
  delay_ms(10); 
  LED0_PWM_VAL=45;   
  delay_ms(10); 
   LED0_PWM_VAL=0; 
 } 
}
        仿真结果如下:




 

 






冬夜冰城
2楼-- · 2019-07-21 09:02
不错,常来看看
cybrian
3楼-- · 2019-07-21 11:47
回复【2楼】正点原子:
-------------------------------    

“当设置OCxP的值为0的时候,100%占空比输出是高电平,当设置OCxP为1的时候,100%占空比输出是低电平。从而控制了输出极性。”,

就是匹配时,OCx的输出电平就等于设置的OCxP的电平,对吧?

还有那个)OCxREF  到底什么用呢?
正点原子
4楼-- · 2019-07-21 16:23
 精彩回答 2  元偷偷看……
RR子海
5楼-- · 2019-07-21 19:13
回复【5楼】正点原子:
-------------------------------
原子哥。。实验8PWM输出中:TIM2->CCMR1|=7<<4;  //CH1 WM2模式,TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平
                           TIM2->CCER|=1<<0;   //高电平有效,OC1输出使能,OC1信号输出到对应的输出引脚
                           //当TIM2->CCR1由0到300,灯由暗变亮

         我修改成:TIM2->CCMR1|=7<<4;  //CH1 WM2模式,TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平
                  TIM2->CCER|=3<<0;   //低电平有效, 
                  //按照原理应该是当TIM2->CCR1由0到300,灯由亮变暗
                  //但实际情况确是:一直很亮。。
有点迷惑。。。
十分迷惑。。。
相当迷惑。。。 
正点原子
6楼-- · 2019-07-21 19:26
回复【6楼】RR子海:
-------------------------------
你先仿真下吧.
提示:看看占空比.

一周热门 更多>