切换到宽版
  • 4026阅读
  • 7回复

[STM]STM8学习之——timer1 PWM输出 [复制链接]

上一主题 下一主题
离线zeze10000
 

发帖
2858
M币
8559
专家
35
粉丝
112
只看楼主 倒序阅读 我要置顶 楼主  发表于: 2018-07-01
今天来学习STM8单片机的输出比较功能。
其中的一个应用就是PWM。
PWM脉宽调制波形。
也就是输出频率和占空比可调的方波。
实现方法也简单。
计数器正常计数,每次计数都与捕获比较寄存器进行比较,当计数值小于比较寄存器小时输出高电平或低电平,大于时翻转。
说的不是很准确,总之就是计数器的值和比较寄存器进行比较,得到的结果决定通道的输出。

先来几张图,大家看图说话吧。

输出比较框图

经过比较,得出参考信号,再到死区单元,在经过输出控制单元输出

输出通道的结构细节

计数器和比较寄存器的数值比较后经过输出模式控制器再经过死区时间发生器再经过几重选择后输出。

看看配置过程

首先配置计数器,然后比较寄存器。
然后输出模式,再然后启动计数器。

看看边沿对齐的波形

边沿对齐是相对于计数器的计数方式来说的。
计数器向上或者向下计数都是边沿对齐方式。
计数器向上向下计数则是中间对齐。
两种方式的区别看波形最清楚。

PWM既然是频率和占空比可调的方波就意味者频率和占空比都是可以调整的。
在51里,频率的调整主要是计数器的计数频率,也就是计数溢出的时间等于计数周期。
在STM8里计数器不用溢出。
它的频率由计数器时钟频率和重装载寄存器共同决定。
同样,溢出时间就是PWM的周期,上下计数的方式比较特别,两次向下溢出的时间间隔才是周期,因此比单独计数的周期长一倍。

废话不多说了,今天就是实验PWM输出。
timer1有四个通道,就能输出四个频率相同,占空比独立的波形,1、2、3通道还有互补输出。
3路互补输出可以用来做无刷电机驱动了。

先看看简单的

边沿对齐方式,两路互补输出。频率是10K。
1通道占空比50%,2通道占空比25%。

再来一个图

这个是中间对齐方式,频率占空比相同,波形以中间对齐。

再来一张

这个是带有10个计数器周期死区补偿的。

死区补偿主要用来驱动桥式电路。
因为MOS的结电容特性,MOS的关断和开启都有延时,为了避免桥式电路的上管和下管同时导通导致炸管,
因此带有一段死区控制时间,确保上下管不会同时导通。

贴上测试代码
  1. /*PWM实验*/
  2. #include<iostm8s105k4.h>
  3. void init()
  4. {
  5.   CLK_SWCR=0x02;        //时钟切换
  6.   CLK_SWR=0xb4;         //外部晶体
  7.   CLK_CKDIVR=0x00;      //不分频
  8.   
  9.   PB_DDR_DDR0=1;        //输出端口配置,推挽输出、高速
  10.   PB_CR1_C10=1;
  11.   PB_CR2_C20=1;
  12.   
  13.   PB_DDR_DDR1=1;
  14.   PB_CR1_C11=1;
  15.   PB_CR2_C21=1;
  16.   
  17.   PC_DDR_DDR1=1;
  18.   PC_CR1_C11=1;
  19.   PC_CR2_C21=1;
  20.   
  21.   PC_DDR_DDR2=1;
  22.   PC_CR1_C12=1;
  23.   PC_CR2_C22=1;
  24.   
  25.   TIM1_ARRH=0x03;       //重装载寄存器 800
  26.   TIM1_ARRL=0x20;
  27.   TIM1_CCR1H=0x01;      //比较寄存器1 400
  28.   TIM1_CCR1L=0x90;
  29.   TIM1_CCR2H=0x00;      //比较寄存器2 200
  30.   TIM1_CCR2L=0xc8;
  31.   
  32.   TIM1_CCMR1=0x60;      //捕获比较模式配置 PWM模式1
  33.   TIM1_CCMR2=0x60;
  34.   TIM1_CCER1=0x55;      //捕获比较通道配置
  35.   
  36.   TIM1_CR1=0x61;        //计数器配置 中间对齐
  37.   TIM1_DTR=0x0a;        //死区发生器配置 10个计数时钟
  38.   TIM1_BKR=0x80;        //开比较输出使能
  39. }
  40. int main( void )
  41. {
  42.   init();
  43.   while(1);
  44.   
  45. }


STM8的 timer1资源丰富,使用方法多样。
了解了结构和工作方式之后使用起来并不难。
配置好相应的寄存器就能实现所需的各种功能。

大家加油!

THE END!
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖最近打赏记录:共4条打赏M币+50
66ok66 M币 +8 请继续 .... 2018-07-04
2545889167 M币 +20 总的来说,PWM输出还是比输入捕获要稍微简单些哈~ 2018-07-02
温力口 M币 +9 谢谢分享。。。。。 2018-07-01
数码家园 M币 +13 謝謝分享 2018-07-01
离线zxianyu

发帖
47
M币
103
专家
0
粉丝
7
只看该作者 1楼 发表于: 2018-07-01
请登录后查看
离线szhywhyw
发帖
12
M币
494
专家
1
粉丝
4
只看该作者 2楼 发表于: 2018-07-01
请登录后查看
离线温力口

发帖
60313
M币
51283
专家
569
粉丝
909
只看该作者 3楼 发表于: 2018-07-01
请登录后查看
离线2545889167

发帖
13268
M币
20754
专家
302
粉丝
4860
只看该作者 4楼 发表于: 2018-07-02
请登录后查看
离线zxianyu

发帖
47
M币
103
专家
0
粉丝
7
只看该作者 5楼 发表于: 2018-07-02
请登录后查看
离线zeze10000

发帖
2858
M币
8559
专家
35
粉丝
112
只看该作者 6楼 发表于: 2018-07-03
请登录后查看
离线lhuijiang

发帖
355
M币
855
专家
1
粉丝
10
只看该作者 7楼 发表于: 2018-07-13
请登录后查看
快速回复
限80 字节
温馨提示:所有技术区严禁灌水,“沙发”“顶”字样;禁止广告贴;以免被删除
 
上一个 下一个