本帖最后由 asmine 于 2022-2-25 15:53 编辑
这里借用原子的一个总结,
感觉功底很扎实,膜拜一下!
在《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;
}
}
仿真结果如下:
|