STM8S0 TIM1_PWM互补输出

目录:
1.定时器1和互补PWM基础
2.程序:
1、TIM1_CH1_PWM互补+死区
2、TIM1_CH2_PWM互补+死区
3、TIM1_CH1_PWM+TIM1_CH2_PWM互补+死区

 3.采用IAR仿真需设置:选择IAR菜单ST-Link,选择Option Bytes,配置如图(见文章末尾)

一、定时器1互补PWM基础
1. TIM1为高级定时器,定时器是16位计数,有65536种分频,分频系数1-65536。可以选择计数方向(分为向上和向下两种计数方向)
2.使能外设时钟寄存器(CLK_PCKENR) :开启或者关闭外设时钟
3.TIM1_EGR:事件产生寄存器,可以 重新初始化TIM1定时器
4. 控制寄存器 1(TIM1_CR1):地址偏移值:0x00 ;复位值:0x00
5.重复计数寄存器(TIM1_RCR)
REP[7:0]: 重复计数器的值
开启了预装载功能后,这些位允许用户设置比较寄存器的更新速率(即周期性地从预装载寄存器
传输到当前寄存器);如果允许产生更新中断,则会同时影响产生更新中断的速率。
每次向下计数器REP_CNT达到0,会产生一个更新事件并且计数器REP_CNT重新从REP值开
始计数。由于REP_CNT只有在周期更新事件U_RC发生时才重载REP值,因此对TIM1_RCR寄
存器写入的新值只在下次周期更新事件发生时才起作用。
这意味着在PWM模式中,(REP+1)对应着:
- 在边沿对齐模式下,PWM周期的数目;
- 在中心对称模式下,PWM半周期的数目;
6 .预分频器 分(TIM1_PSCRH) 和(TIM1_PSCRL),设定预分频系数时必须高位(TIM1_PSCRH)在前低位(TIM1_PSCRL)在后。
预分频器用于对CK_PSC进行分频。
计数器的时钟频率(fCK_CNT)等于fCK_PSC/( PSCR[15:0]+1)。
PSCR包含了当更新事件产生时装入当前预分频器寄存器的值(更新事件包括计数器被
TIM_EGR的UG位清0或被工作在复位模式的从控制器清0)。这意味着为了使新的值起作用,必
须产生一个更新事件。
(切记:通用定时器可以选择16种分频,基本定时器只能选择8种分频)
7.捕获/比较使能寄存器 1(TIM1_CCER1):对于 互补输出的通道,该位需要预装载
8.捕获/比较寄存器 1 分高位(TIM1_CCR1H) 和低位(TIM1_CCR1L) ,配置PWM的占空比值
若CC1通道配置为输出(TIM1_CCMR1的CC1S位):
CCR1包含了装入当前捕获/比较1寄存器的值(预装载值)。
如果在TIM1_CCMR1寄存器(OC1PE位)中未选择预装载功能,写入的数值会立即传输至当前寄
存器中。否则只有当更新事件发生时,此预装载值才传输至当前捕获/比较1寄存器中。
当前捕获/比较寄存器的值同计数器TIM1_CNT的值相比较,并在OC1端口上产生输出信号。
若CC1通道配置为输入:
CCR1包含了上一次输入捕获1事件(IC1)发生时的计数器值(此时该寄存器为只读)。
9. 自动装载寄存器 高位(TIMx_ARRH) 和 自动装载寄存器低位(TIMx_ARRL) 
这两个寄存器复位值都是0x00。需要注意的是,高级定时器TIM1和通用定时器TIM2,TIM3,TIM5都是16位计数的定时器,操作寄存器的时候要先写高8位再写低8位。而基本定时器TIM4,TIM6是8位计数的定时器,是不分高8位和低8位的,所以操作基本定时器的时候寄存器名字是(TIMx_ARR)。 操作重装载寄存器的时候更新的值不会马上写入重装载寄存器,而是等到有中断产生的时候操作的数值才会写入寄存器,当然也可以用软件的方法产生中断。
10.捕获/比较模式寄存器 1(TIM1_CCMR1):
通道可 用于输入(捕获模式)或输出(比较模式),通道的方向由相应的CC1S位定义。该寄存器其
它位的作用在输入和输出模式下不同。
0C1M[2:0]:输出比较1模式
该3位定义了输出参考信号OC1REF的动作,而OC1REF决定了OC1的值。OC1REF是高电平
有效,而OC1的有效电平取决于CC1P位。
000:冻结。输出比较寄存器TIM1_CCR1与计数器TIM1_CNT间的比较对OC1REF不起作用;
001:匹配时设置通道1的输出为有效电平。当计数器TIM1_CNT的值与捕获/比较寄存器1
(TIM1_CCR1)相同时,强制OC1REF为高。
010:匹配时设置通道1的输出为无效电平。当计数器TIM1_CNT的值与捕获/比较寄存器1
(TIM1_CCR1)相同时,强制OC1REF为低。
011:翻转。当TIM1_CCR1=TIM1_CNT时,翻转OC1REF的电平。
100:强制为无效电平。强制OC1REF为低。
101:强制为有效电平。强制OC1REF为高。
110:PWM模式1- 在向上计数时,一旦TIM1_CNT<TIM1_CCR1时通道1为有效电平,否则
为无效电平;在向下计数时,一旦TIM1_CNT>TIM1_CCR1时通道1为无效电平(OC1REF=0),
否则为有效电平(OC1REF=1)。
111:PWM模式2- 在向上计数时,一旦TIM1_CNT<TIM1_CCR1时通道1为无效电平,否则
为有效电平;在向下计数时,一旦TIM1_CNT>TIM1_CCR1时通道1为有效电平,否则为无效
电平
11.控制寄存器 1(TIMx_CR1) 
复位值0x00,这个寄存器对所有定时器适用。 
12.刹车寄存器(TIM1_BKR)
二,程序:
1、TIM1_CH1_PWM互补+死区
void PWM2_INIT()
{
    CLK_PCKENR2 |= 0x80;//开启定时器1外设时钟
    TIM1_EGR |= 0x01;   //重新初始化TIM1 
    TIM1_CR1 = 0x00;   //B7(0)可以直接写入 B65(00)边缘对齐模式B4(0)向上计数B3(0)计数器不停止发生更新事件
    TIM1_RCR = 0x00;  
    TIM1_PSCRH =0;     //设定预分频为,16分频 16M
    TIM1_PSCRL =0x00;  //PWM的时钟 影响周期
    TIM1_CCER1 = 0x0F; //CC2ER1开启1,2,高电平有效
    TIM1_CCMR1 = 0x60; //PWM模式1,CC1配置入输出
    TIM1_ARRH = 0x03;     //设定重装载值
    TIM1_ARRL = 0xe7;  //PWM的周期 
    TIM1_CCR1H = 0x01;
    TIM1_CCR1L = 0xf4;  // 占空比值
    TIM1_CR1 |= 0x01; //使能TIM1计数器
    TIM1_DTR = 0x50;        // Deadtime generator
    TIM1_BKR |= 0x80;
}
2、TIM1_CH2_PWM互补+死区
void PWM2_INIT()
{
    CLK_PCKENR1 |= 0x80;//开启定时器1外设时钟
    TIM1_EGR |= 0x01;   //重新初始化TIM1 
    TIM1_CR1 = 0x00;   //B7(0)可以直接写入 B65(00)边缘对齐模式B4(0)向上计数B3(0)计数器不停止发生更新事件
    TIM1_RCR = 0x00;  
    TIM1_PSCRH =0;     //设定预分频为,16分频 16M
    TIM1_PSCRL =0x00;  //PWM的时钟 影响周期
    TIM1_CCER1 = 0xf0; //CC2ER1开启1,2,高电平有效
    TIM1_CCMR2 = 0x60; //PWM模式1,CC1配置入输出
    TIM1_ARRH = 0x03;     //设定重装载值
    TIM1_ARRL = 0xe7;  //PWM的周期 
    TIM1_CCR2H = 0x01;
    TIM1_CCR2L = 0xf4;  // 占空比值
    TIM1_CR1 |= 0x01; //使能TIM1计数器
TIM1_DTR = 0x50;        // Deadtime generator
    TIM1_BKR |= 0x80;
}
3、TIM1_CH1_PWM+TIM1_CH2_PWM互补+死区
void PWM2_INIT()
{
    CLK_PCKENR1 |= 0x80;//开启定时器1外设时钟
    TIM1_EGR |= 0x01;   //重新初始化TIM1 
    TIM1_CR1 = 0x00;   //B7(0)可以直接写入 B65(00)边缘对齐模式B4(0)向上计数B3(0)计数器不停止发生更新事件
    TIM1_RCR = 0x00;  
    TIM1_PSCRH =0;     //设定预分频为,16分频 16M
    TIM1_PSCRL =0x00;  //PWM的时钟 影响周期
    TIM1_CCER1 = 0xff; //CC2ER1开启1,2,高电平有效
    TIM1_CCMR1 = 0x60; //PWM模式1,CC1配置入输出
    TIM1_CCMR2 = 0x60; //PWM模式1,CC1配置入输出
    TIM1_ARRH = 0x03;     //设定重装载值
    TIM1_ARRL = 0xe7;  //PWM的周期 
    TIM1_CCR1H = 0x01;
    TIM1_CCR1L = 0xf4;  // 占空比值
    TIM1_CCR2H = 0x01;
    TIM1_CCR2L = 0xf4;  // 占空比值
    TIM1_CR1 |= 0x01; //使能TIM1计数器
TIM1_DTR = 0x50;        // Deadtime generator
    TIM1_BKR |= 0x80;
}

三、采用IAR仿真需设置:选择IAR菜单ST-Link,选择Option Bytes,配置如图

程序如下:亲测可以使用。
#include <iostm8s003f3.h>
/*
//TIM1_CH1_PWM互补+死区
void PWM2_INIT()
{
    CLK_PCKENR2 |= 0x80;//开启定时器1外设时钟
    TIM1_EGR |= 0x01;   //重新初始化TIM1 
    TIM1_CR1 = 0x00;   //B7(0)可以直接写入 B65(00)边缘对齐模式B4(0)向上计数B3(0)计数器不停止发生更新事件
    TIM1_RCR = 0x00;  
    TIM1_PSCRH =0;     //设定预分频为,16分频 16M
    TIM1_PSCRL =0x00;  //PWM的时钟 影响周期
    TIM1_CCER1 = 0x0F; //CC2ER1开启1,2,高电平有效
    TIM1_CCMR1 = 0x60; //PWM模式1,CC1配置入输出
    TIM1_ARRH = 0x03;     //设定重装载值
    TIM1_ARRL = 0xe7;  //PWM的周期 
    TIM1_CCR1H = 0x01;
    TIM1_CCR1L = 0xf4;  // 占空比值
    TIM1_CR1 |= 0x01; //使能TIM1计数器
    TIM1_DTR = 0x50;        // Deadtime generator
    TIM1_BKR |= 0x80;
}
*/
/*
//TIM1_CH2_PWM互补+死区
void PWM2_INIT()
{
    CLK_PCKENR1 |= 0x80;//开启定时器1外设时钟
    TIM1_EGR |= 0x01;   //重新初始化TIM1 
    TIM1_CR1 = 0x00;   //B7(0)可以直接写入 B65(00)边缘对齐模式B4(0)向上计数B3(0)计数器不停止发生更新事件
    TIM1_RCR = 0x00;  
    TIM1_PSCRH =0;     //设定预分频为,16分频 16M
    TIM1_PSCRL =0x00;  //PWM的时钟 影响周期
    TIM1_CCER1 = 0xf0; //CC2ER1开启1,2,高电平有效
    TIM1_CCMR2 = 0x60; //PWM模式1,CC1配置入输出
    TIM1_ARRH = 0x03;     //设定重装载值
    TIM1_ARRL = 0xe7;  //PWM的周期 
    TIM1_CCR2H = 0x01;
    TIM1_CCR2L = 0xf4;  // 占空比值
    TIM1_CR1 |= 0x01; //使能TIM1计数器
TIM1_DTR = 0x50;        // Deadtime generator
    TIM1_BKR |= 0x80;
}
*/
//TIM1_CH1_PWM+TIM1_CH2_PWM互补+死区
void PWM2_INIT()
{
    CLK_PCKENR1 |= 0x80;//开启定时器1外设时钟
    TIM1_EGR |= 0x01;   //重新初始化TIM1 
    TIM1_CR1 = 0x00;   //B7(0)可以直接写入 B65(00)边缘对齐模式B4(0)向上计数B3(0)计数器不停止发生更新事件
    TIM1_RCR = 0x00;  
    TIM1_PSCRH =0;     //设定预分频为,16分频 16M
    TIM1_PSCRL =0x00;  //PWM的时钟 影响周期
    TIM1_CCER1 = 0xff; //CC2ER1开启1,2,高电平有效
    TIM1_CCMR1 = 0x60; //PWM模式1,CC1配置入输出
    TIM1_CCMR2 = 0x60; //PWM模式1,CC1配置入输出
    TIM1_ARRH = 0x03;     //设定重装载值
    TIM1_ARRL = 0xe7;  //PWM的周期 
    TIM1_CCR1H = 0x01;
    TIM1_CCR1L = 0xf4;  // 占空比值
    TIM1_CCR2H = 0x01;
    TIM1_CCR2L = 0xf4;  // 占空比值
    TIM1_CR1 |= 0x01; //使能TIM1计数器
TIM1_DTR = 0x50;        // Deadtime generator
    TIM1_BKR |= 0x80;
}
int main(void)
{
  /* Infinite loop */
  CLK_CKDIVR=0x00;/*设置时钟为内部16M高速时钟*/
  PWM_INIT();
  //PWM2_INIT();
  while(1)
  {
  }
}

  • 4
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
您好!要初始化 STM32 的 TIM8 定时器作为 PWM 输出,您需要按照以下步骤操作: 步骤1:配置 GPIO 引脚 首先,您需要配置定时器输出引脚,并将其设置为替代功能模式。例如,如果要将定时器8通道1的输出引脚配置为 PA7 引脚,则可以执行以下代码: ```c // 配置 PA7 引脚 GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // 将引脚设置为定时器8的替代功能 GPIO_InitStruct.Alternate = GPIO_AF3_TIM8; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); ``` 步骤2:配置定时器 接下来,您需要初始化定时器 TIM8,并进行所需的配置。要初始化 TIM8 作为 PWM 模式,请使用以下代码: ```c // 初始化 TIM8 TIM_HandleTypeDef htim8 = {0}; htim8.Instance = TIM8; htim8.Init.Prescaler = 0; // 设置预分频 htim8.Init.Period = 1000; // 设置周期 htim8.Init.CounterMode = TIM_COUNTERMODE_UP; // 设置计数模式 htim8.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; // 设置时钟分频 htim8.Init.RepetitionCounter = 0; // 设置重复计数器 HAL_TIM_PWM_Init(&htim8); ``` 步骤3:配置定时器通道 最后,您需要配置定时器通道,以确定 PWM 的占空比。例如,如果要配置通道1为 50% 的占空比,则可以执行以下代码: ```c TIM_OC_InitTypeDef sConfigOC = {0}; sConfigOC.OCMode = TIM_OCMODE_PWM1; // 设置 PWM 模式 sConfigOC.Pulse = 500; // 设置占空比 sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; // 设置输出极性 sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; // 禁用快速模式 HAL_TIM_PWM_ConfigChannel(&htim8, &sConfigOC, TIM_CHANNEL_1); ``` 最后,您可以使用 `HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1)` 来启动 PWM 输出。 这是一个基本的初始化过程,您可以根据需要进行更多配置和调整。希望这对您有所帮助!如有任何问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汽车观察侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值