历史上的今天
返回首页

历史上的今天

今天是:2025年02月04日(星期二)

2020年02月04日 | STM8S0 TIM1_PWM互补输出

2020-02-04 来源:eefocus

目录:

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_CNT>TIM1_CCR1时通道1为无效电平(OC1REF=0),

否则为有效电平(OC1REF=1)。

111:PWM模式2- 在向上计数时,一旦TIM1_CNT为有效电平;在向下计数时,一旦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

/*

//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)

  {

  }

}

推荐阅读

史海拾趣

常州星海电子(Starsea)公司的发展小趣事

在电子行业,技术创新是企业持续发展的关键。常州星海电子一直致力于技术的研发和创新。近年来,公司成功取得了一项名为“一种高反压二极管”的专利,通过采用先进的生产工艺和设计,实现了产品性能的优化和成本的降低。这一创新不仅提升了公司的市场竞争力,也为整个电子行业的发展注入了新的活力。

Ferranti Electric Inc公司的发展小趣事

为了更好地满足全球客户的需求,Ferranti Electric Inc公司积极实施全球化战略。公司不仅在英国本土拥有生产基地和研发中心,还在全球范围内设立了多个分支机构和办事处。通过全球化布局,公司能够更好地了解不同市场的需求和特点,为客户提供更加定制化的产品和服务。同时,公司也积极参与国际竞争和合作,提升其在全球电气行业的影响力。

General Dynamics SATCOM Technologies公司的发展小趣事

随着技术的不断发展和创新,Ferranti Electric Inc公司在电气领域取得了显著的成就。特别是在设计和制造用于恶劣气候或关键安全领域的复杂、高可靠性电气产品方面,公司展示了其卓越的技术实力。这些产品不仅广泛应用于军用领域,同时也为民用领域提供了大量电气产品解决方案。公司的全球影响力逐渐扩大,产品远销世界各地。

Hi-Optel Technologly Co Ltd公司的发展小趣事

作为一家具有社会责任感的企业,Ferranti Electric Inc公司一直致力于可持续发展。公司注重环保和节能,采用环保材料和生产工艺,减少对环境的影响。同时,公司也积极参与公益事业和社会活动,回馈社会。这些举措不仅体现了公司的社会责任感,也为公司的长远发展奠定了坚实的基础。

ACP Optoelectronic Technology Co Ltd公司的发展小趣事

为了进一步提升技术实力和市场份额,ACP Optoelectronic Technology Co Ltd积极寻求与其他企业的战略合作。公司先后与多家知名电子企业签订了技术合作协议,共同开发新产品,共享市场资源。这些合作不仅提升了ACP Optoelectronic Technology Co Ltd的技术水平,也为其带来了更多的商业机会,推动了公司的快速发展。

Digital Core Design公司的发展小趣事

1988年,Core Design由Jeremy Heath-Smith创立,起初仅有8名员工和1万6千英镑的注册资金。这家新兴的游戏开发公司很快凭借其首款游戏《Rick Dangerous》在英国游戏市场崭露头角。这款游戏凭借其独特的游戏机制和引人入胜的故事情节,迅速登上英国游戏销量榜的榜首,并赢得了欧洲年度游戏奖,为Core Design的未来发展奠定了坚实的基础。

问答坊 | AI 解惑

精品推荐!

坛子里好东西的确很多,我想在这里把我这块片子相关的东西都收集到这里啦! 来讨论,实时的更新一下啦! 这个是绝对经典的好帖子! https://bbs.eeworld.com.cn/thread-50631-1-1.html 一般不是我自己的东西!!! [ 本帖最后由 gaoxiao 于 20 ...…

查看全部问答>

武汉某军校的训练题

本帖最后由 paulhyde 于 2014-9-15 08:55 编辑 与大家共享  …

查看全部问答>

头文件的寄存器定义

在头文件中,经常看到类似如下的定义,帮忙解释下这种定义: #define PINSEL0 (*((volatile unsigned long *) 0xE002C000)) 我对它的理解如下,不知是否正确。 volatile是修饰变量类型,表示寄存器变量,其值是可变的,某些变化(非程序)可能引 ...…

查看全部问答>

关于语法的一点小疑问

_reg_CSI_CSISR = BIT_SOF_INT; ///BIT_SOF_INT是_reg_CSI_CSISR寄存器一位的值  #define BIT_SOF_INT (0x1 …

查看全部问答>

帮我推荐一款24位的A/D

大侠!我想采集0~5V的电压模拟信号,请问用哪款A/D适合? 我看来好多A/D转化器,譬如: LTC2400,它只有一个地引脚,没有模拟地、数字地之分,请问合适吗?不会有干扰吗? ADS1211,它需要外接晶振,请问有没有更加好用、精准的24位A/D? 谢谢!…

查看全部问答>

CAN,I2C,I2S,ISP,SSP总线简介

网上找到觉得不错特来分享,同时MARK下 …

查看全部问答>

关于单片机的出租车计价器

先看一下要求: 出租车计价器设计 基本要求: (1)能显示里程,单位为公里,最后一位为小数位。 (2)能显示金额数,单位为元,最后一位为小数位。 (3)可设定单程价格和往返价格,单程价格为2元/公里,往返价格为1.5元/公里。 (4)车速…

查看全部问答>

利用HERCULES消防机器人及工业无线遥控器

创意的名称:利用HERCULES消防机器人及工业无线遥控器 功能特点应用范围:利用HERCULES消防机器人工业无线遥控器具有侦察和自救功能,将灾害现场通过机器人上的摄象机采集视频信号后由遥控器接收机通过微波传输给指挥员所观看的遥控器发射机显示屏 ...…

查看全部问答>

求购一款 TI M4 准备参加今年的省赛!!不知哪位坛友可有??

求购一款 TI M4 准备参加今年的省赛!!不知哪位坛友可有?? 求购一款 TI M4 准备参加今年的省赛!!不知哪位坛友可有?? 可加我QQ584361628 …

查看全部问答>