STM8S0 TIM1_PWM互补输出

发布者:塞上老马最新更新时间:2020-02-04 来源: eefocus关键字: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_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)

  {

  }

}

关键字:STM8S0  TIM1  PWM  互补输出 引用地址:STM8S0 TIM1_PWM互补输出

上一篇:STM32——TIM2定时器定时
下一篇:STM8 定时器TIM1 计时

推荐阅读最新更新时间:2024-11-12 00:29

51单片机输出3路PWM,驱动RGB LED源程序
用单片机中断处理PWM,控制普通三色LED,输出七种不同颜色,呼吸变化。不占用程序运行时间。 单片机源程序如下: } else //白色由亮变暗 { time-=t; G_OUT=time; B_OUT=time; R_OUT=time; if(time =MIN
[单片机]
51单片机<font color='red'>输出</font>3路<font color='red'>PWM</font>,驱动RGB LED源程序
PWM方波产生51程序
PWMH DATA 30H ;高电平脉冲的个数 PWM DATA 31H ;PWM周期 COUNTER DATA 32H pwmhmin DATA 33H ORG 0000H AJMP MAIN ;ORG 0003H ;AJMP INT_X0 ;ORG 0013H ;AJMP INT_X1 ORG 000BH AJMP INT_T0 ORG 0100H MAIN: MOV SP,#60H ;给堆栈指针赋初值 mov ie,#87h MOV PWMH,#02H ; MOV COUNTER,#01H MOV PWM,#14H MOV TMOD,#02H ;定时器0在模式2
[单片机]
pic单片机CCP脉冲(PWM输出
#include pic.h //该程序用于使CCP1模块产生分辨率为10位的PWM波形,占空比为50%,根据PWM_WIDE计算频率。proteus仿真通过 //CCP1(CCP2相同设置)模块的PWM工作方式初始化子程序(中断为什么不行呢?) #define CCP1 #define PWM_WIDE 0x7F #define PWM_TOTAL PWM_WIDE 1 void CCPINIT() { #ifdef CCP1 CCPR1L = PWM_WIDE; CCP1CON = 0X3C; //设置CCP1模块为PWM工作方式,且其工作 //循环的低2位为11,高8位为01111111=
[单片机]
使用PWM输出方式驱动有刷直流电机的原理
除了用于电机驱动外,PWM(Pulse Width Modulation=脉冲宽度调制)还广泛应用于DC/DC转换器和AC/DC转换器等电源的功率转换,并在很多领域得到广泛使用。原则上,PWM是通过打开和关闭脉冲来发送所需功率的一种方法。脉冲的大小和周期是恒定的,通过调整打开时的脉冲宽度(时间)来控制要发送的功率。输出电压是对应于导通和脉冲周期的时间比=占空比的平均大小。 下面是有刷直流电机的PWM驱动原理示意图。 电机用电机符号和电阻R+电感L +感应电压Ec表示。当施加电压时,电机电压Ea被施加到电机的两端,流过电机电流Ia。而当OFF时,电机引脚的两端将短路。在这种状态下将发生电流再生。由于线圈的电感起到保持电流的作
[嵌入式]
使用<font color='red'>PWM</font><font color='red'>输出</font>方式驱动有刷直流电机的原理
stm32定时器输入捕获pwm
花了两天时间终于把stm32f103的定时器输入捕获弄懂了,这里以TIM3的通道ch1为例,要实现输入捕获需要配置一下寄存器,TIMx_ARR,TIMx_PSC,TIMx_CCMR1,TIMx_CCER,TIMx_DIER,TIMx_CR1,TIMx_CCR1.这里抓取了一些收据手册中寄存器描述的图 下面一一介绍: TIMx_ARR寄存器为自动重装载的值 TIMx_CR1这里了只要用到它的第0位即使能位。 TIMx_CCMR可以配置对应通道映射到那个IC,TI。 这里我们是第一通道故只需配置低8位,cc1s为配置ch1映射到那个TI,IC1PSC为配置是否分频,1c1f为配置是否滤波。 TIMx_psc寄存器 T
[单片机]
STM8S TIM1 PWM初始化设置
#define TIM1_DIV1 (uint16)(1-1) #define TIM1_DIV2 (uint16)(2-1) #define TIM1_DIV4 (uint16)(4-1) #define TIM1_DIV8 (uint16)(8-1) #define TIM1_DIV16 (uint16)(16-1) #define TIM1_DIV32 (uint16)(32-1) //timer1 PWM 输出到管脚使能 _Bool PWMAOUT_PINENBLE @TIM1_CCER1:0 ;//TIM1_CH1 -- PC6 _Bool PWMBOUT_PINE
[单片机]
【MSP430F5529】一些相关代码
MSP系列的例程相对来说较少,而且F1-F5系列中系统时钟系统不断升级,彼此之间差异很大 这些代码是为了2019年全国大学生电子设计大赛准备的 现在拿出来分享一下,希望可以帮助后面一些人学习一下(因为很少有一本书专门去讲F5529,虽然不同系列彼此之间差异不大,但是做东西的时候你会发现有一些是无法通过编译的,或者编译后功能不好使) PWM呼吸灯1 /* P13为PWM输出口,TA0CCR2越大时灯越亮 */ #include msp430f5529.h void delay_nms(unsigned int n) { unsigned int j; for (j=0; j (n); j++) {
[单片机]
MSP实时输出占空比可调的pwm波形
// 占空比可调的PWM, 我没试过, 手里没单片机, 只是记下. #include msp430x14x.h void main(void) { volatile unsigned int i; WDTCTL = WDTPW + WDTHOLD; // Stop WDT BCSCTL1 |= XTS; // ACLK= LFXT1 = HF XTAL do { IFG1 &= ~OFIFG; // Clear OSCFault flag for (i = 0xFF; i 0; i--) { // Time fo
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved