[STM8] STM8S系列单片机TIM1的PWM配置与TIM2的区别

[复制链接]
825|6
 楼主| 键盘手没手 发表于 2022-4-30 16:17 | 显示全部楼层 |阅读模式
为什么STM8的PWM用TIM1不能输出,TIM2可以,下面针对TIM1的PWM输出做了下列程序代码的编写。

STM8S系列单片机

PC1管脚来控制PWM的输出,即TIM1_CH1通道

PC2管脚来控制PWM的输出,即TIM1_CH2通道

PC3管脚来控制PWM的输出,即TIM1_CH3通道

 楼主| 键盘手没手 发表于 2022-4-30 16:18 | 显示全部楼层
  1. //PWM初始化
  2. void Driver_PWMON(u8 ch,u8 Num)
  3. {
  4.     //开TIM1时钟
  5.     CLK->PCKENR1 |= CLK_PCKENR1_TIM1;

  6.     //设置PWM频率,Fpwm=Fmaster/TIM2_ARR
  7.     //这里Fpwm = 2000000/100 = 20K
  8.     TIM1->ARRH = 0;
  9.     TIM1->ARRL = 100;

  10.     //启动计数,开始PWM输出
  11.     TIM1->BKR |= TIM1_BKR_MOE;

  12.     switch(ch)
  13.     {
  14.         case 1:

  15.             TIM1->CCMR1 |= 0x70;//设置TIM1_CH1为PWM模式2 有效电平为高电平

  16.             pwm_ch_on(1);//开启TIM1_CH1 通道输出

  17.             TIM1->CCR1H = 0;//初始化PWM通道占空比 1:1   
  18.             TIM1->CCR1L = Num;
  19.             break;
  20.         case 2:
  21.             TIM1->CCMR2 |= 0x70;//设置TIM1_CH2为PWM模式2 有效电平为高电平

  22.             pwm_ch_on(2);//开启TIM1_CH1 通道输出

  23.             TIM1->CCR2H = 0;//初始化PWM通道占空比 1:1   
  24.             TIM1->CCR2L = Num;
  25.             break;
  26.         case 3:
  27.             TIM1->CCMR3 |= 0x70;//设置TIM1_CH3为PWM模式2 有效电平为高电平

  28.             pwm_ch_on(3);//开启TIM1_CH1 通道输出

  29.             TIM1->CCR3H = 0;//初始化PWM通道占空比 1:1   
  30.             TIM1->CCR3L = Num;
  31.             break;
  32.         case 4:
  33.             TIM1->CCMR4 |= 0x70;//设置TIM1_CH4为PWM模式2 有效电平为高电平

  34.             pwm_ch_on(4);//开启TIM1_CH1 通道输出

  35.             TIM1->CCR4H = 0;//初始化PWM通道占空比 1:1   
  36.             TIM1->CCR4L = Num;
  37.             break;
  38.     }
  39.     TIM1->CR1 |= TIM1_CR1_CEN;
  40. }

  41. //PWM占空比调节 0-100
  42. void Driver_PWMSet(u8 ch,u8 Num)
  43. {
  44.     if(Num > 100)
  45.           return;
  46.     switch(ch)
  47.     {
  48.         case 1:
  49.              TIM1->CCR1L = Num;
  50.             break;
  51.         case 2:
  52.             TIM1->CCR2L = Num;
  53.             break;
  54.         case 3:
  55.             TIM1->CCR3L = Num;
  56.             break;
  57.         case 4:
  58.             TIM1->CCR4L = Num;
  59.             break;
  60.     }
  61. }

  62. //打开PWM通道
  63. void pwm_ch_on(u8 ch)
  64. {
  65.     switch(ch)
  66.     {
  67.         case 1:
  68.             TIM1->CCER1 |= 0x01;
  69.             break;
  70.         case 2:
  71.             TIM1->CCER1 |= 0x10;
  72.             break;
  73.         case 3:
  74.             TIM1->CCER2 |= 0x01;
  75.             break;
  76.         case 4:
  77.             TIM1->CCER2 |= 0x10;
  78.             break;
  79.     }
  80. }

  81. //关闭PWM通道
  82. void pwm_ch_close(u8 ch)
  83. {
  84.     switch(ch)
  85.     {
  86.         case 1:
  87.             TIM1->CCER1  &= ~0x01;
  88.             break;
  89.         case 2:
  90.             TIM1->CCER1  &= ~0x10;
  91.             break;
  92.         case 3:
  93.             TIM1->CCER2  &= ~0x01;
  94.             break;
  95.         case 4:
  96.             TIM1->CCER2  &= ~0x10;
  97.             break;
  98.     }
  99. }

  100. //运行主函数

  101. int main(void)
  102. {
  103.   Driver_PWMON(1,0);
  104.   Driver_PWMON(2,0);
  105.   Driver_PWMON(3,0);
  106.   while(1)
  107.   {
  108.      u8 a= 0,b=0;
  109.     for(b=1 ;b<4; b++)
  110.     {
  111.       for(a=1;a<99;a++)
  112.       {
  113.         Driver_PWMSet(b,a);
  114.         delay_ms(5);
  115.       }
  116.       for(a=99;a>0;a--)
  117.       {
  118.         Driver_PWMSet(b,a);
  119.         delay_ms(5);
  120.       }
  121.     }
  122.   }
  123. }
 楼主| 键盘手没手 发表于 2022-4-30 16:26 | 显示全部楼层
TIM2的跟TIM1的区别是:TIM1->BKR |= TIM1_BKR_MOE;

TIM2不需要配置这个寄存器。

OCi的输出使能通过(TIM1_CCERi和TIM1_BKR寄存器中)CCiE、MOE、OISi和
OSSR位和OSSI位的组合来控制。
jkl21 发表于 2022-5-28 17:11 | 显示全部楼层
stm32的有区别吗?
小明的同学 发表于 2022-5-28 18:35 | 显示全部楼层
两个的配置寄存器不太一样啊
biechedan 发表于 2022-5-29 12:55 | 显示全部楼层
这个一样的。   
hudi008 发表于 2022-5-29 13:14 | 显示全部楼层
STM8S有几个定时器?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

104

主题

1260

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部