今天来学习STM8单片机的输出比较功能。
其中的一个应用就是PWM。
PWM脉宽调制波形。
也就是输出频率和占空比可调的方波。
实现方法也简单。
计数器正常计数,每次计数都与捕获比较寄存器进行比较,当计数值小于比较寄存器小时输出高电平或低电平,大于时翻转。
说的不是很准确,总之就是计数器的值和比较寄存器进行比较,得到的结果决定通道的输出。
先来几张图,大家看图说话吧。
输出比较框图
经过比较,得出参考信号,再到死区单元,在经过输出控制单元输出
输出通道的结构细节
计数器和比较寄存器的数值比较后经过输出模式控制器再经过死区时间发生器再经过几重选择后输出。
看看配置过程
首先配置计数器,然后比较寄存器。
然后输出模式,再然后启动计数器。
看看边沿对齐的波形
边沿对齐是相对于计数器的计数方式来说的。
计数器向上或者向下计数都是边沿对齐方式。
计数器向上向下计数则是中间对齐。
两种方式的区别看波形最清楚。
PWM既然是频率和占空比可调的方波就意味者频率和占空比都是可以调整的。
在51里,频率的调整主要是计数器的计数频率,也就是计数溢出的时间等于计数周期。
在STM8里计数器不用溢出。
它的频率由计数器时钟频率和重装载寄存器共同决定。
同样,溢出时间就是PWM的周期,上下计数的方式比较特别,两次向下溢出的时间间隔才是周期,因此比单独计数的周期长一倍。
废话不多说了,今天就是实验PWM输出。
timer1有四个通道,就能输出四个频率相同,占空比独立的波形,1、2、3通道还有互补输出。
3路互补输出可以用来做无刷电机驱动了。
先看看简单的
边沿对齐方式,两路互补输出。频率是10K。
1通道占空比50%,2通道占空比25%。
再来一个图
这个是中间对齐方式,频率占空比相同,波形以中间对齐。
再来一张
这个是带有10个计数器周期死区补偿的。
死区补偿主要用来驱动桥式电路。
因为MOS的结电容特性,MOS的关断和开启都有延时,为了避免桥式电路的上管和下管同时导通导致炸管,
因此带有一段死区控制时间,确保上下管不会同时导通。
贴上测试代码
- /*PWM实验*/
- #include<iostm8s105k4.h>
- void init()
- {
- CLK_SWCR=0x02; //时钟切换
- CLK_SWR=0xb4; //外部晶体
- CLK_CKDIVR=0x00; //不分频
-
- PB_DDR_DDR0=1; //输出端口配置,推挽输出、高速
- PB_CR1_C10=1;
- PB_CR2_C20=1;
-
- PB_DDR_DDR1=1;
- PB_CR1_C11=1;
- PB_CR2_C21=1;
-
- PC_DDR_DDR1=1;
- PC_CR1_C11=1;
- PC_CR2_C21=1;
-
- PC_DDR_DDR2=1;
- PC_CR1_C12=1;
- PC_CR2_C22=1;
-
- TIM1_ARRH=0x03; //重装载寄存器 800
- TIM1_ARRL=0x20;
- TIM1_CCR1H=0x01; //比较寄存器1 400
- TIM1_CCR1L=0x90;
- TIM1_CCR2H=0x00; //比较寄存器2 200
- TIM1_CCR2L=0xc8;
-
- TIM1_CCMR1=0x60; //捕获比较模式配置 PWM模式1
- TIM1_CCMR2=0x60;
- TIM1_CCER1=0x55; //捕获比较通道配置
-
- TIM1_CR1=0x61; //计数器配置 中间对齐
- TIM1_DTR=0x0a; //死区发生器配置 10个计数时钟
- TIM1_BKR=0x80; //开比较输出使能
- }
- int main( void )
- {
- init();
- while(1);
-
- }
STM8的 timer1资源丰富,使用方法多样。
了解了结构和工作方式之后使用起来并不难。
配置好相应的寄存器就能实现所需的各种功能。
大家加油!
THE END!