STM8学习笔记——PWM模块
stm8笔记2-定时3更新中断+pwm输出(IDE为IAR)
stm8笔记2-定时3更新中断+pwm输出(IDE为IAR)⼀:IAR编译器中断函数说明下⾯说⼀下在IAR下,在IAR下必须要添加iostm8s105s6.h⽂件,在⽂件的最后有如下内容:/*-------------------------------------------------------------------------* Interrupt vector numbers*-----------------------------------------------------------------------*/#define AWU_vector 0x03#define SPI_TXE_vector 0x0C#define SPI_RXNE_vector 0x0C#define SPI_WKUP_vector 0x0C#define SPI_CRCERR_vector 0x0C#define SPI_OVR_vector 0x0C#define SPI_MODF_vector 0x0C#define TIM1_OVR_UIF_vector 0x0D#define TIM1_CAPCOM_BIF_vector 0x0D#define TIM1_CAPCOM_TIF_vector 0x0D#define TIM1_CAPCOM_CC1IF_vector 0x0E#define TIM1_CAPCOM_CC2IF_vector 0x0E#define TIM1_CAPCOM_CC3IF_vector 0x0E#define TIM1_CAPCOM_CC4IF_vector 0x0E#define TIM1_CAPCOM_COMIF_vector 0x0E#define TIM2_OVR_UIF_vector 0x0F#define TIM2_CAPCOM_CC1IF_vector 0x10#define TIM2_CAPCOM_TIF_vector 0x10#define TIM2_CAPCOM_CC2IF_vector 0x10#define TIM2_CAPCOM_CC3IF_vector 0x10#define UART1_T_TXE_vector 0x13#define UART1_T_TC_vector 0x13#define UART1_R_OR_vector 0x14#define UART1_R_RXNE_vector 0x14#define UART1_R_IDLE_vector 0x14#define UART1_R_PE_vector 0x14#define UART1_R_LBDF_vector 0x14#define I2C_ADD10_vector 0x15#define I2C_ADDR_vector 0x15#define I2C_OVR_vector 0x15#define I2C_STOPF_vector 0x15#define I2C_BTF_vector 0x15#define I2C_WUFH_vector 0x15#define I2C_RXNE_vector 0x15#define I2C_TXE_vector 0x15#define I2C_BERR_vector 0x15#define I2C_ARLO_vector 0x15#define I2C_AF_vector 0x15#define I2C_SB_vector 0x15#define ADC1_AWS0_vector 0x18#define ADC1_AWS1_vector 0x18#define ADC1_AWS2_vector 0x18#define ADC1_AWS3_vector 0x18#define ADC1_AWS4_vector 0x18#define ADC1_AWS5_vector 0x18#define ADC1_AWS6_vector 0x18#define ADC1_EOC_vector 0x18#define ADC1_AWS8_vector 0x18#define ADC1_AWS9_vector 0x18#define ADC1_AWDG_vector 0x18#define ADC1_AWS7_vector 0x18#define TIM4_OVR_UIF_vector 0x19#define FLASH_EOP_vector 0x1A#define FLASH_WR_PG_DIS_vector 0x1A对照中断向量表,如果⽤到中断,必须⾃⼰写中断,⽐如TIM3定时器中断#pragma vector=TIM3_OVR_UIF_vector__interrupt void TIM3_UPD_OVF_IRQHandler (void){TIM3_SR = 0X00;//清除中断标志}⽤关键字#pragma vector=指出本中断处理函数指向的中断号,⽤关键字__interrupt作为函数的前缀,表⽰这是中断处理函数。
STM8教程-第十四章 STM8S207 PWM 模块及其应用实例
第十四章STM8S207 PWM 模块及其应用实例上一节我们学习了定时器中的基本定时器编程,这一节学习定时器里面一个PWM模块。
当终于到了PWM 模块编程时,有些许怀念,怀念过去的一年之中的日以继夜相对的PWM。
忘了介绍我们的团队---风驰,也就是第六届飞思卡尔比赛中的一个队伍。
1、PWM 介绍脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。
简单一点,就是对脉冲宽度的控制。
PWM 在实际应用很广,例如上面提到的飞思卡尔智能车就用到PWM 控制舵机以及电机。
关于舵机是如何用PWM 控制的,这里不详细说明,有兴趣的建议查询相关知识。
这些在模型制作中应用十分广泛。
关于PWM 如果控制电机的这里略为说明,因为和本节有些许关联普通直接电机在通电时以全电压工作,在没有PWM 控制电机之前是运用继电器通过不停开断实现对电机的速度控制。
引入PWM 就可以更为灵活控制电机。
PWM 是脉冲宽度可调的方波,在10K 左右的频率下,通过不同的占空比就可以得到近似稳定的电压。
例如输入5V,占空比为50%时,电压近似 2.5V。
我们这节实验也是应用PWM 这个特性。
利用PWM 中的占空比调节LED 的亮度。
关于PWM 的说明这里也简要说明,PWM 第一个参数是PWM 的周期,也就是一个PWM 的时间。
这个可以通过对应的寄存器进行设置,而我们的STM8S207 通过PSCR 设置定时器的时钟源CK_CNT,然后再通过ARR 寄存器设置周期。
例如我们这节的实验使用了16M 内部时钟源,LED4 是接着PD3 的,也就是TIM2_CH2,PSCR只能是2 的次幂,我们选择了4 分频。
CK_CNT = 4M,然后ARR 设置为200,分频200 后直接提供PWM 的时钟,所以f_pwm = 4M/200 = 20KHz。
STM8单片机TIME1-PWM应用
通过以上 配置,比 较模块可 以工作了
计数器高 8 位(TIM1_CNTRH) 计数器低 8 位(TIM1_CNTRL)
这两个寄存器存放着 Tim 1 的当前计数值
预分频器的高 8 位(TIM1_PSCRH) TIM1 的分频系数从 1~65535 之间任意 预分频器的低 8 位(TIM1_PSCRL) 自动重装载寄存器高 8 位(TIM1_ARRH) TIM1 的计数最大值 自动重装载寄存器低 8 位(TIM1_ARRL) 捕获/比较寄存器 1 高 8 位(TIM 1_CCR1H) 通过设置目标通道的比较值来设置 PWM 的占空比 捕获/比较寄存器 1 低 8 位(TIM 1_CCR1L) 普通定时器到此就 ok 了,但是 TIM1 却不行,还缺一步(因其功能更强大,多 了刹车功能) 刹车寄存器(TIM 1_BKR)TIM 1->BKR|=0x80 原理: 比较 TIM 1_CNT、TIM 1_ARR(3 者中最大值) 、TIM1_CCR1 ,根据前面选择的 PWM 模式 1 中的规定知:向上计数时, TIM1_CNT < TIM1_CCR1 时通道 1 为 有效电平(本例有效电平为低) ,所以 TIM 1_CCR1 的值越大,低电平的时间越 长,led 亮的时间越长 所以程序中要进行如下操作: 1. 其余寄存器初始化 2. 不断改变 TIM 1->CCR1H、TIM1->CCR1L 的值(即 PWM 占空比)
TIME1-PWM 例程简单讲解归纳
对于 PWM 信号,主要涉及到两个概念:一个就是 PWM 信号的周期或频率, 另一个就是 PWM 器模块。 涉及寄存器: 控制寄存器(TIM 1_CR1=0X01;// 启动定时器) 捕获/比较模式寄存器(TIM 1_CCMR1 通道设置为输出,选择 PWM 模式 1) 捕获/比较使能寄存器(TIM 1_CCER1 使能比较输出和设置 PWM 的极性)
STM8例程—音乐播放(使用定时器PWM)
作者:宇辰_hong *
Music_Num=Music_Num+3;
if(Music_Num>74)
M
usic_Num=0;
}
TIM2_ARRH=FREQH[Music_Freq]/256;
TIM2_ARRL=FREQH[Music_Freq]%256;
PWM=FREQH[Music_Freq]/8;
TIM2_CCR1H=PWM/256; //PWM占空比为%20
TIM2_CCR1L=PWM%256;
5,1,1, 5,1,1, 6,1,2, 5,1,2, 2,2,2, 1,2,4,
5,1,1, 5,1,1, 5,2,2, 3,2,2, 1,2,2, 7,1,2, 6,1,2,
4,2,1, 4,2,1, 3,2,2, 1,2,2, 2,2,2, 1,2,4};
//音乐数据,三个数据为一组,其中第一个数据表示音调,第二个数据表示音调高低,其中1为低8度,2为正常,3为高8度
} ;
//音阶频率表,根据每个音调的频率(网上可查),以及定时器的频率计算出来的
void Time2_Init(void);
void Time3_Init(void);
void main( void )
{
Time2_Init();
Time3_Init();
asm("RIM");
/************************广东工业大学电子科技协会******************** *
while(1)
{
}
}
STM8S003F3通过PWM波实现三基色呼吸灯
前段时间使用STM8S003F3实现了一个三基色灯的各种效果,故写一篇文章作为一个记录。
1综述我们知道,要是的LED灯亮直接通电即可。
而要改变灯的亮度,我们有两种方法:改变电流和PWM调光。
我们首先想到的就是改变它的驱动电流,因为LED的亮度是几乎和它的电流直接成正比关系。
然而用调正向电流的方法来调节亮度会产生一个问题:在调亮度的同时也会改变它的光谱和色温,这样就会会产生色偏。
因为目前白光LED都是用蓝光LED加黄色荧光粉而产生,当正向电流减小时,蓝光LED亮度增加而黄色荧光粉的厚度并没有按比例减薄,从而使其光谱的主波长增长。
这个问题对于一般的照明是没有问题的,因为色温的变化量毕竟不是很大。
但是对电源来说当电流过小时会产生闪烁,除非电源的恒流范围很宽,完全可以从0到最大。
这样才没有问题。
简而言之,电流调光有色温变化和电源电流过小产生闪烁的问题。
曾经做过一个项目,用于某设备上需要非常非常平稳的调光,显然电流调光是无法实现。
同时像本文介绍的三基色调光有颜色要求的显然也不行。
因此我们使用PWM调光。
既然PWM调光可以避免上面的两个问题,为什么不直接都用PWM调光呢因为我们毕竟是做产品,要考虑成本问题。
使用PWM调光至少需要一颗能支持PWM 的芯片(当然还有外围电路,但是电流调光也是有电路的。
我们也应该知道PWM 信号也可以由脉冲发生器提供),另外它需要编写程序。
所以只有在需要的场合才使用PWM调光(使用PWM调光需要注意的问题是频率不能太低或者太高,推荐150-400Hz之间。
)。
PWM的优点如下:●PWM调光就不会产生色偏,因为它总是工作在0或者最大两种状态。
●PWM的占空比很好控制,而且精度高●对电源没有影响,因为不会改变电源的工作条件,只是给电源开或者关。
2PWM波调光的原理脉宽调制(PWM)是利用微处理器的数字输出来对模拟电路进行控制的的技术,广泛应用在从测量、通信到功率控制与变换及LED照明等许多领域中。
PWM模块使用
序:关于飞思卡尔单片机,大致用了大半年了,总结下关于一些PWM的模块应用,飞思卡尔单片机的一个麻烦的在于寄存器很多,仅是PWM模块就有36个寄存器,总共是十个寄存器。
所以使用好飞思卡尔单片机就要学习下每一个寄存器。
在这里,本人也是初学,大致写写自己的一些笔记吧。
北京理工大学珠海学院徐方鑫 E-MAIL:280599580@例程:/*******************//功能:完成PWM模块初始化//入口参数:无//出口参数:无*******************/void PWM_Init(void){PWME=0x00; //禁止PWM模块PWMPRCLK=0x06; //CLOCK A的预分频设置为6PWMSCLA=125; //SA的分频因子设置为125PWMCLK=0x01; //通道0选择SA作为PWM时钟PWMPER0=200; //通道0周期寄存器设置为200PWMDTY0=0; //通道0占空比寄存器设置PWMPOL=0x01; //PWM输出先为高电平,之后变为低电平PWMCAE=0x00; //左对齐输出PWMCTL=0x00; //不级联PWME=0x01; //使能PWM通道0}以上是一个基本的PWM初始化程序,利用了很多PWM的寄存器,下面就根据不同的寄存器讲解一下。
(1)PWM允许寄存器(PWM Enable Register)PWME可以通过设置相应的控制位启动或者停止PWM信号的输出。
但是,由于PMWMEx需要与时钟源同步,直到PWM模块时钟下一个周期到来,才能输出正确的PWM波形。
注:当处于级联模式时,8个8位PWM通道通过两两级联构成4个16位PWM通道,此时PWME1,PWME3,PWME5和PWME7对应控制4个16位PWM 通道,而其他控制位无效。
读:任何时刻写:任何时刻1表示允许PWMx通道输出,0表示禁止PWMx通道输出(2)PWM极性寄存器(PWM Polarity Register)PWMPOL是极性寄存器,如果极性选择为是1,周期开始时PWM通道输出高电平,当通道计数器数值等于占空比计数值时翻转为低电平;相反,如果极性选择位是0,周期开始时PWM通道输出低电平,当通道计数器数值等于占空比计数器值时翻转为高电平。
STM8教程-第十三章 STM8S207 定时器模块及其应用实例
第十三章STM8S207 定时器模块及其应用实例这一节,我们将向大家介绍如何使用STM8 的定时器中的基本定时功能,STM8 的定时器功能十分强大,有TIM1 高级定时器,也有TIM2、TIM3 等通用定时器,还有TIM4 基本定时器。
在STM8S 参考手册里面,定时器的介绍占了1/3 的篇幅,足见其重要性。
这一节,我们分别介绍TIM1 到TIM4 定时器中的基本定时功能。
例程一、16 位高级控制定时器(TIM1)简介:TIM1 由一个16 位的自动装载计数器组成,它由一个可编程的预分频器驱动。
TIM1 有4 个通道,分别是1 到4。
分别对应于四个不同的捕获/比较通道。
高级控制定时器适用于许多不同的用途:基本的定时测量输入信号的脉冲宽度(输入捕获)产生输出波形(输出比较,PWM 和单脉冲模式)对应与不同事件(捕获,比较,溢出,刹车,触发)的中断与TIM5/TIM6 或者外部信号(外部时钟,复位信号,触发和使能信号)同步高级控制定时器广泛的适用于各种控制应用中,包括那些需要中间对齐模式PWM 的应用,该模式支持互补输出和死区时间控制。
高级控制定时器的时钟源可以是内部时钟,也可以是外部的信号,可以通过配置寄存器来进行选择。
这一节我们实现的功能是基本的定时,关于PWM 的编程留下以后的章节中。
还有建议大家研究更为深入的功能TIM1 的时基单元包括,如下图所示:●16 位向上/向下计数器●16 位自动重载寄存器●重复计数器●预分频器16 位计数器,预分频器,自动重载寄存器和重复计数器寄存器都可以通过软件进行读写操作。
自动重载寄存器由预装载寄存器和影子寄存器组成。
可在在两种模式下写自动重载寄存器:●自动预装载已使能(TIM1_CR1 寄存器的ARPE 位置位)。
在此模式下,写入自动重载寄存器的数据将被保存在预装载寄存器中,并在下一个更新事件(UEV)时传送到影子寄存器。
●自动预装载已禁止(TIM1_CR1 寄存器的ARPE 位清除)。
STM8_TIM1_PWM输入捕获学习
K看图2 从左到右 依次配置完成检测通道: 根据输入信号 TIi 的特点,可通过配置 TIM1_CCMRi 寄存器中的 ICiF位来设置相应的输入滤波器的滤波时间。 假设输入信号在最多 5个时钟周期的时间内抖动,我们须配置滤波器的带宽长于5个时 钟周期;因此我们可以连续采样8次,以确认在TI1上一次真实的 边沿变换,即在TIMi_CCMR1寄存器中写入IC1F=0011,此时, 只有连续采样到 8 个相同的 TI1 信号,信号才为有效 ( 采样频率为 fMASTER)。 选择 TI1 通道的有效转换边沿,在 TIM1_CCER1 寄存器中写入 CC1P=0(上升沿)。 配置输入预分频器。在本例中,我们希望捕获发生在每一个有效 的电平转换时刻, 因此预分频器被禁止(写TIM1_CCMR1寄存器的
IC1PS=00) 选择有效输入端:例如TIM1_CCMR1连接到TI1输入,所以写入 TIM1_CCMR1寄存器中的CC1S=01,此时通道被配置为输入,并 且TIM1_CCR1寄存器变为只读。 设置TIM1_CCER1寄存器的CC1E=1,允许捕获计数器的值到捕 获寄存器中。 如果需要,通过设置TIM1_IER寄存器中的CC1IE位允许相关中断 请求。 以上便完成了 基本通道 如果有有效电平来 就产生事件或者中断。 配置很简单 诸如以下的例程:选择有效输入一般捕获的占空比是 PWM 输入捕获是普通捕获的一种特殊情况: 50%
它使用两个通道计算波形的周期和占空比: 看上图 我们使用 CH1 和 CH2 一起,不过我们配置信号只是 从 CH1 口输入,然后通过 TI1FP2 到 IC2 然后进入边沿检测,按照 手册的配置过程:
CC2S=10(选中TI1FP2)。 4. 选择TI1FP2的有效极性(捕获数据到TIM1_CCR2): 置CC2P=1(下 降沿有效)。 5. 选择有效的触发输入信号: 置TIM1_SMCR寄存器中的TS=101(选 择TI1FP1)。触发信号为上升沿
4 PWM模块
第八章 ATD模块和PWM模块
CLOCKSA(B) 从CLOCKA(B)进行分频的比例因子可以为1、2、 4、8、16、32、64、128、256,最大可以进行512分 频。计算公式为:
CLOCKSA(B)=CLOCKA(B)/(2*PRESCALER)
通道0、1、4、5可选CLOCKA或CLOCKSA 通道2、3、6、7可选CLOCKB或CLOCKSB 时钟的选择PWMCLK寄存器中的PCLKx位来控制
第八章 ATD模块和PWM模块
居中对齐的输出波型
• CAEx=1,则对应通道的输出格式是居中对齐的。
计数器既进行加法计数也进行减法计数。 当计数器加法计数到占空比寄存器中的值时,PWM 通道输出波形的电平 发生变化; 当加法计数到周期寄存器中的值时,计数器会从加法计数改变为减法计数; 当计数器再次减法计数到占空比寄存器中的值时,PWM 通道输出波形的 电平再次发生变化; 当计数器继续减法计数到$00 时,计数器重新变为加法计数器,然后再次 读取占空比和周期寄存器中的值作为下次计数参考使用。
第八章 ATD模块和PWM模块
允许控制寄存器--PWME 允许控制寄存器
PWMEx:通道有效选择位。1=允许PWM输出,0=禁止。 当PWMEx 被置位后,PWM 输出就会立即开始。但是直到 PWM 模块时钟的下一个周期到来之时,才可以输出正确的波 形,而在这之前的波形可能会是无效的。 当处于级联模式时,8 个8 位PWM 通道组成4 个16 位的 PWM 通道,PWME1、PWME3、PWME5 和PWME7 对这4 个通道进行控制,而其它控制位处于无效状态。
第八章 ATD模块和PWM模块
下面举一个左对齐输出的例子:
假设时钟源频率=10MHz(周期=100ns),PPOLx=0(首先输出 低电平),PWMPERx=4(周期寄存器),PWMDTYx=1(占空 比寄存器)。 所以,PWMx 的频率 = 10MHz/4 = 2.5MHz,PWMx 的周期 PWMx 2.5MHz PWMx =400ns,PWMx 的占空比=3/4×100% = 75%。
STM8S学习笔记
main() {
unsigned char i; TIM_Init();
// 初始化定时器
while(1)
// 进入无限循环
{ // 下面的循环将占空比逐渐从 0 递增到 50%
// b1 = 0,允许更新
// 设置控制器,启动定时器
TIM2_IER = 0x01;
// 允许更新中断
_asm("rim");
// 允许 CPU 全局中断
while(1)
// 进入无限循环
{
}
}
// 函数功能:定时器 4 的更新中断服务程序 // 输入参数:无 // 输出参数:无
// 返 回 值:无
PD_CR1 = 0x08; PD_CR2 = 0x00;
// 将 PD3 设置成推挽输出
// 然后初始化定时器 4
TIM4_IER = 0x00;
// 禁止中断
TIM4_EGR = 0x01;
// 允许产生更新事件
TIM4_PSCR = 0x07;
// 计数器时钟=主时钟/128=2MHZ/128
TIM2_CCER1 = TIM2_CCER1 | 0x30; // CC polarity low,enable PWM output */ // CC2P = 1,低电平为有效电平 // CC2E = 1,开启输出引脚
//初始化自动装载寄存器,决定 PWM 方波的频率, //Fpwm=4000000/256=15625HZ TIM2_ARRH = 0; TIM2_ARRL = 0xFF; //初始化比较寄存器,决定 PWM 方波的占空比 TIM2_CCR2H = 0; TIM2_CCR2L = 0; // 初始化时钟分频器为 1,即计数器的时钟频率为 Fmaster=4MHZ TIM2_PSCR = 0; // 启动计数 TIM2_CR1 = TIM2_CR1 | 0x01; }
PWM 模块原理及使用
PWM模块原理及使用F28027有8路PWM(四个模块),4路HRPWM,特别对设计高精度电源提供了方便,每个PWM模块中又包括以下几个子模块:时基(Time-base)模块、计数比较(Counter-compare)模块、功能限定(Action-qualifier)模块、死区控制(Dead-band)模块、斩波(PWM-chopper)模块、事件触发(Event-trigger)(不知道这样翻译恰当否)模块、数字比较(Digital Compare)模块、制动(Trip-zone)模块。
从这些模块的命名上看,用它来做个电源,是再恰当不过的了。
一、时基子模块(TB)每一个ePWM模块,都有自己的TB,它产生PWM的所有定时事件,且有同步逻辑,可以使多个PWM模块有序工作。
TBPRD:PWM的计数周期寄存器。
TBPHS:相位控制寄存器,在多个PWM模块级联时,可以控制每路输出的相位。
当时基模块的同步脉冲到来时,使计数器从TBPHS设置的值开始计数(丢弃当前计数值)。
TBCTL:TB的控制寄存器,可以对相位方向(只在up-down时有用)控制,决定是上计数时同步(PHSDIR=1)还是下计数时同步(PHSDIR=0);决定TB 输入时钟的分频系数;向下一级输出的同步脉冲的输出方式;计数值重装方式、计数方式、同步允许等控制。
TBCTR:计数寄存器。
TB模块的当前计数值。
TBSTS:TB的状态寄存器。
二、计数比较子模块(CC)此模块实现与TB的比较及控制。
产生CMPA、CMPB比较事件;控制PWM 的占空比。
CMPCTL:计数比较控制寄存器。
决定是否使用影子寄存器及计数值的重装方法。
CMPA:计数比较值设定寄存器ACMPAM:CMPA的影子寄存器。
CMPB:计数比较值设定寄存器B三、功能限定子模块(AQ)这个子模块主要对TB及CC模块产生的事件,作出相应的响应,如计数器到达设定同期时、到达0时、到达CMPA时、到达CMPB时,相应的EPWMxA、EPWMxB的输出状态。
PWM模块和时钟系统模块学习笔记
PWM模块1.PWM通道占空比寄存器PWM Channel Duty Register(PWMDTY)每个通道都有一个专用的用来设置占空比的寄存器PWMDTYx,PWMDTYx和PWMPERx 的值共同决定了占空比的值,就是说当每个通道的count的值计数到与PWMDTYx的值相等时,相应的输出信号就发生一次翻转。
如果你设置PWMPOL寄存器的某位PPOLx 的值为1,也就是开始的时候输出为高电平,然后当计数器数到与PWMDTYx的值后就翻转为低电平,那么PWMDTY寄存器的值就包含了高电平的时间,再结合占空比说明一下吧PPOLx=1:占空比=(PWMDTYx/PWMPERx)*100%PPOLx=0:占空比=(PWMPERx-PWMDTYx)/PWMPERx*100%2.PWM通道周期寄存器PWM Channel Period Registers(PWMPERx)每个通道都有一个专用的用来设置周期情况的寄存器(PWMPERx),这个寄存器的值就决定了PWM通道输出信号周期的长短,如果我们已经知道的参考时钟源的值,那么就可以计算出PWM输出信号的周期了,计算方法如下:PWMxPeriod=ChannelClockPeriod*PWMPERx(左对齐情况下即CAEx=0) PWMxPeriod=ChannelClockPeriod*PWMPERx*2(居中对齐情况下即CAEx=1) 3. PWM使能寄存器PWM Enable Register(PWME)PWME[7:0]分别控制着对应的8个通道的使能,例如:PWME_PWME0=0:禁止通道0的PWM输出PWME_PWME7=1: 使能通道7的PWM输出3.PWM极性寄存器PWM Polarity Register(PWMPOL)PWMPOL寄存器是用来控制PWM一开始输出时的信号高低情况,假如PPOLX设为1,则与之相应的PWM通道在开始的时候输出为高电平,然后等到计数器的值与你设置的那个PWM 信号的值(PWMDTYx)相等的时候就输出低电平。
STM8的C语言编程(14)-- PWM
STM8的C语言编程(14)--PWM在单片机应用系统中,也常常会用到PWM信号输出,例如电机转速的控制。
现在很多高档的单片机也都集成了PWM功能模块,方便用户的应用。
对于PWM信号,主要涉及到两个概念,一个就是PWM信号的周期或频率,另一个就是PWM信号的占空比。
例如一个频率为1KHZ,占空比为30%,有效信号为1的PWM信号,在用示波器测量时,就是高电平的时间为300uS,低电平的时间为700uS的周期波形。
在单片机中实现PWM信号的功能模块,实际上就是带比较器的计数器模块。
首先该计数器循环计数,例如从0到N,那么这个N就决定了PWM的周期,PW M周期=(N+1)*计数器时钟的周期。
在计数器模块中一定还有一个比较器,比较器有2个输入,一个就是计数器的当前值,另一个是可以设置的数,这个数来自一个比较寄存器。
当计数器的值小于比较寄存器的值时,输出为1(可以设置为0),当计数器的值大于或等于比较寄存器的值时,输出为0(也可设置为1,与前面对应)。
了解了这个基本原理后,我们就可以使用STM8单片机中的PWM模块了。
下面的实验程序首先将定时器2的通道2设置成PWM输出方式,然后通过设置自动装载寄存器TIM2_CCR2,决定PWM信号的周期。
在程序的主循环中,循环修改占空比,先是从0逐渐递增到128,然后再从128递减到0。
当把下面的程序在ST的三合一板上运行时,可以看到发光二极管LD1逐渐变亮,然后又逐渐变暗,就这样循环往复。
如果用示波器看,可以看到驱动LD1的信号波形的占空比从0变到50%,然后又从50%变到0。
同样还是利用ST的开发工具,生成一个C语言程序的框架,然后修改其中的m ain.c,修改后的代码如下。
// 程序描述:用PWM输出驱动LED#include "STM8S207C_S.h"void CLK_Init(void);void TIM_Init(void);// 函数功能:延时函数// 输入参数:ms -- 要延时的毫秒数,这里假设CPU的主频为2MHZ// 输出参数:无// 返回值:无// 备注:无void DelayMS(unsigned int ms){unsigned char i;while(ms != 0){for(i=0;i<250;i++){}for(i=0;i<75;i++){}ms--;}}// 函数功能:初始化时钟// 输入参数:无// 输出参数:无// 返回值:无// 备注:无void CLK_Init(){CLK_CKDIVR = 0x11; // 10: fHSI = fHSI RC output/ 4// = 16MHZ / 4 =4MHZ// 001: fCPU=fMASTER/2. = 2MHZ}// 函数功能:初始化定时器2的通道2,用于控制LED的亮度// 输入参数:无// 输出参数:无// 返回值:无// 备注:无void TIM_Init(){TIM2_CCMR2 = TIM2_CCMR2 | 0x70;// Output mode PWM2.// 通道2被设置成比较输出方式// OC2M = 111,为PWM模式2,// 向上计数时,若计数器小于比较值,为无效电平// 即当计数器在0到比较值时,输出为1,否则为0TIM2_CCER1 = TIM2_CCER1 | 0x30;// CC polarity low,enable PWM ou tput */// CC2P = 1,低电平为有效电平// CC2E = 1,开启输出引脚//初始化自动装载寄存器,决定PWM方波的频率,Fpwm=4000000/256=1562 5HZTIM2_ARRH = 0;TIM2_ARRL = 0xFF;//初始化比较寄存器,决定PWM方波的占空比TIM2_CCR2H = 0;TIM2_CCR2L = 0;// 初始化时钟分频器为1,即计数器的时钟频率为Fmaster=4MHZTIM2_PSCR = 0;// 启动计数TIM2_CR1 = TIM2_CR1 | 0x01;}main(){unsigned char i;CLK_Init(); // 初始化时钟TIM_Init(); // 初始化定时器while(1) // 进入无限循环{// 下面的循环将占空比逐渐从0递增到50%for(i=0;i<128;i++){TIM2_CCR2H = 0;TIM2_CCR2L = i;DelayMS(5);}// 下面的循环将占空比逐渐从50%递减到0for(i=128;i>0;i--){TIM2_CCR2H = 0;TIM2_CCR2L = i;DelayMS(5);}}}。
STM8 Nucleo-64板使用TIM外设生成PWM信号应用说明书
AN5180使用STM8 Nucleo-64板生成PWM信号引言NUCLEO-8S208RB(基于STM8S208RBT6器件构建)和NUCLEO-8L152R8(基于STM8L152R8T6器件构建)板能够评估所有STM8S系列和STM8L系列微控制器的主要功能。
本应用笔记提供了如何使用TIM定时器外设生成三个PWM信号的简要说明。
表 1. 适用产品参考文档•STM8 Nucleo-64板数据摘要(DB3591)•STM8L152R8T6 Nucleo-64板用户手册(UM2351)•STM8S208RBT6 Nucleo-64板用户手册(UM2364)1应用描述本章说明了硬件需求、应用原理图以及应用在NUCLEO-8S208RB或NUCLEO-8L152R8板上使用TIM外设生成三个PWM信号的应用原理。
1.1硬件要求在NUCLEO-8S208RB或NUCLEO-8L152R8开发板,无需额外硬件。
示波器一台1.2应用原理图两个板的应用原理图如下图所示。
图 1. STM8S系列应用原理图图 2. STM8L系列应用原理图1.3应用原理本应用使用TIM的PWM(脉冲宽度调制)模式,来生成三个PWM 信号。
•对于STM8S 系列器件,使用TIM2•对于STM8L系列器件,使用TIM1生成的过程如下图所示。
图 3. PWM生成原理根据定时器计数器时钟,TIM从0开始计数,增加到自动加载寄存器的值(TIM_ARR)。
•当计数器值等于比较/捕获寄存器(TIM_CCRx)值时,通道x信号置为0。
•当计数器值达到TIM_ARR值时,计数器复位,通道x信号置为1。
通过配置TIMx_CCRx和TIMx_ARR寄存器,用户可方便地修改所生成PWM信号的占空比和频率(请参见第 2 节软件说明)。
默认情况下,应用提供三种PWM信号,如下表所述。
提示能够配置AFR选项字节,在PD2上也得到通道3。
表 2. 默认的PWM信号2软件说明本例使用STM8S系列和STM8L系列标准固件库来驱动通用外设的功能。
【STM8学习笔记1】 一步步学习 使用TIM1测量PWM波
2触发 如果是用的普通的计时器例如古董51的话,计时器清零的步骤就可以在上升沿中断的时候 手动清零,不过STM8 的TIM1有个复位触发模式很适用:
计数器开始依据内部时钟计数,然后正常计数直到 TI1 出现一个上升沿;此时,计数器被清 零然后从 0 重新开始计数。同时,触发标志(TIM1_SR1 寄存器 的 TIF 位)被置位,如果使能 了中断(TIM1_IER 寄存器的 TIE 位),则产生一个中断请求。 下图显示当自动重装载寄存器 TIMx_ARR=0x36 时的动作。在 TI1 上升沿和计数器的实际复位之间的延时取决于 TI1 输入端 的重同步电路。
return; }
//读取周期
一基本 TIM1 测量 PWM 波形原理
(原文件名:111.png) 根据上图所示测量PWM的基本思想如下: 每个上升沿开始计数,监测到下降沿时记录下当前值为高电平时间,再检测到一个下降沿记 录下当前值为周期,同时清零计数器开始测量下个周期。
二 TIM1 的硬件结构 1 信号如何输入的
打开手册 翻到
将 PWM 波注入 CH2 引脚。在中断返回前设置断点,然后进行仿真, 将 IC2Value,IC1Value;放入 watch 窗口观察。 void TIME1_INIT(void) {
TIM1_DeInit(); //时基单元
//时钟触发控制器 TIM1->SMCR |=0X64;//选源触发源 ti2fp2 //捕获 比较 TIM1->CCMR1 |=0x02;// ch1 到 ti2fp1
if(TIM1_GetITStatus(TIM1_IT_CC1)) {
IC1Value=TIM1_GetCapture1(); TIM1_ClearITPendingBit(TIM1_IT_CC1);
飞思卡尔PWM模块
飞思卡尔脉冲宽度调制模块——PWM模块目录1.简介 (1)2.特征 (1)3.框图 (1)4.功能描述 (2)4.1 预置分频器 (2)4.2 PWM发生器 (2)4.2.1 对齐 (2)4.2.2 周期 (3)4.2.3 脉宽占空比 (4)4.3 独立或互补信道操作 (4)4.4 死区发生器 (6)4.4.1 上、下管死区调整 (8)4.4.2 人工死区调整 (10)4.5 自动死区调整 (12)4.6 不对称PWM输出 (13)4.6 不对称PWM输出 (14)5.软件输出控制 (14)6.PWM发生器的装入 (15)6.1 装入使能 (15)6.2 装入频率 (15)6.3 重装标志 (17)6.4 同步输出 (19)6.5 初始化 (19)7.故障保护 (20)7.1 初始化 (20)7.2 自动故障清除 (21)7.3 手工故障清除 (21)8.操作模式 (22)9.引脚描述 (22)9.1 PWM0~PWM5引脚 (22)9.2 FAULT0~FAULT3引脚 (22)9.3 IS0~IS2引脚 (22)10.寄存器定义 (22)10.1 PWM控制寄存器(PMCTL) (24)10.1.1 装入频率(LDFQ)位15-12 (24)10.1.2 半周期重装(HALF)位11 (24)10.1.3 电流极性2(IPOL2)位10 (24)10.1.4 电流极性1(IPOL1)位9 (25)10.1.5 电流极性0(IPOL0)位8 (25)10.1.6 Prescaler(PRSC)位7-6 (25)10.1.7 PWM重装中断允许(PWMRIE)位5 (25)10.1.8 PWM重装标志(PWMF)位4 (25)10.1.9 电流状态(ISENS)位3-2 (26)10.1.10 允许装入(LDOK)位1 (26)10.1.11 PWM使能(PWMEN)位0 (26)10.2 PWM故障控制寄存器(PMFCTL) (26)10.2.1 保留位位15-8 (26)10.2.2 FAULT n引脚中断使能(FIE n)位7,5,3,1 (26)10.2.3 FAULT n引脚清除模式(FMODE n)位6,4,2,0 (27)10.3 PWM故障状态和确认寄存器(PMFSA) (27)10.3.1 FAULT n(FPIN n)位15,13,11,9 (27)10.3.2 FAULT n引脚标志(FFLAG n)位14,12,10,8 (27)10.3.3 保留位位7 (27)10.3.4 FAULT n引脚确认(FTACK n)位6,4,2,0 (27)10.3.5 死区n(DT n)位5-0 (27)10.4 PWM输出控制寄存器(PMOUT) (28)10.4.1 输出端衰减器使能(PAD_EN)位15 (28)10.4.2 保留位14 (28)10.4.3 输出控制使能(OUTCTRL5-0)位13-8 (28)10.4.4 保留位7-6 (28)10.4.5 输出控制(OUT5-0)位5-0 (28)10.5 PWM计数寄存器(PMCNT) (29)10.5.1 保留位15 (29)10.5.2 计数器(CNT)位14-0 (29)10.6 PWM计数器模数寄存器(PWMCM) (29)10.6.1 保留位15 (29)10.6.2 计数器模数(CM)位14-0 (29)10.7 PWM值寄存器(PWMV AL0-5) (30)10.7.1 值(V AL)位15-0 (30)10.8 PWM死区寄存器(PMDEADTM) (30)10.8.1 保留位15-12 (30)10.8.2 死区位11-0 (30)10.9 PWM禁止映射寄存器(PMDISMAP1-2) (31)10.10 PWM设置寄存器(PMCFG) (31)10.10.1 保留位15 (31)10.10.2 调试允许(DBG_EN)位14 (31)10.10.3 等待允许(WAIT_EN)位13 (31)10.10.4 边沿对齐或中心对齐PWM(EDG)位12 (32)10.10.5 保留位11 (32)10.10.6 上边PWM极性(TOPNEG)位10-8 (32)10.10.7 下边PWM极性(BOTNEG)位6-4 (32)10.10.8 独立或互补对操作(INDEP)位3-1 (32)10.10.9 写保护(WP)位0 (32)10.11 PWM通道控制寄存器(PMCCR) (33)10.11.1 硬件加速使能(ENHA)位15 (33)10.11.2 56F80x 兼容性(nBX)位14 (33)10.11.3 Mask(MSK5-0)位13-8 (33)10.11.4 保留位7-6 (33)10.11.5 值寄存器装入模式(VLMODE)位5-4 (33)10.11.6 保留位3 (34)10.11.7 Swap45(SWP45)位2 (34)10.11.8 Swap23(SWP23)位1 (34)10.11.9 Swap01(SWP01)位0 (34)10.12 PWM端口寄存器(PMPORT) (34)10.12.1 保留位15-7 (35)10.12.2 保留位6-0 (35)10.13 PWM内部调整控制寄存器(PMICCR) (35)10.13.1 保留位15-3 (35)10.13.2 内部电路控制2(ICC2)位2 (35)10.13.3 内部电路控制1(ICC1)位1 (35)10.13.4 内部电路控制0(ICC0)位0 (36)11.时钟 (36)12.中断 (36)13.复位 (36)1.简介PWM模块可以产生6路独立的或三对互补的PWM输出或二者的混合(例如:一对互补、四个独立的PWM)。
单片机pwm控制基本原理详解
单片机pwm控制基本原理详解PWM是Pulse Width Modulation的缩写,它的中文名字是脉冲宽度调制,一种说法是它利用微处理器的数字输出来对模拟电路进行控制的一种有效的技术,其实就是使用数字信号达到一个模拟信号的效果。
这是个什么概念呢?我们一步步来介绍。
首先从它的名字来看,脉冲宽度调制,就是改变脉冲宽度来实现不同的效果。
我们先来看三组不同的脉冲信号,如图所示。
图 10-1 PWM 波形这是一个周期是 10ms,即频率是 100Hz 的波形,但是每个周期内,高低电平脉冲宽度各不相同,这就是PWM 的本质。
在这里大家要记住一个概念,叫做“占空比”。
占空比是指高电平的时间占整个周期的比例。
比如第一部分波形的占空比是40%,第二部分波形占空比是 60%,第三部分波形占空比是 80%,这就是 PWM 的解释。
那为何它能对模拟电路进行控制呢?大家想一想,我们数字电路里,只有 0 和 1 两种状态,比如我们第 2 章学会的点亮 LED 小灯那个程序,当我们写一个 LED = 0;小灯就会长亮,当我们写一个 LED = 1;小灯就会灭掉。
当我们让小灯亮和灭间隔运行的时候,小灯是闪烁。
如果我们把这个间隔不断的减小,减小到我们的肉眼分辨不出来,也就是 100Hz 以上的频率,这个时候小灯表现出来的现象就是既保持亮的状态,但亮度又没有LED = 0;时的亮度高。
那我们不断改变时间参数,让 LED = 0;的时间大于或者小于 LED = 1;的时间,会发现亮度都不一样,这就是模拟电路的感觉了,不再是纯粹的0 和1,还有亮度不断变化。
大家会发现,如果我们用 100Hz 的信号,如图 10-1 所示,假如高电平熄灭小灯,低电平点亮小灯的话,第一部分波形熄灭4ms,点亮 6ms,亮度最高,第二部分熄灭 6ms,点亮 4ms,亮度次之,第三部分熄灭 8ms,点亮 2ms,亮度最低。
那么用程序验证一下我们的理论,我们用定时器T0 定时改变P0.0 的输出来实现PWM,与纯定时不同的是,这里我们每周期内都要重载两次定时器初值,即用两个不同的初值来控制高低电平的不同持续时间。
PWM笔记
1:PWME 寄存器(开关某通道)PWMEx=1开;2:PWMPOL 寄存器(控制某通道翻转)PWMPOLx=1 高电平有效; 3:PWMCLK 寄存器(选择时钟源)0、1、4、5选A 、SA ;2、3、6、7选B 、SB 。
PCLKx=1 SAorSB ;PCLKx=0 AorB 。
4:PWMPRCLK 寄存器(对时钟源A 、B 预分频)高位分B ,低位分A ;分频结果=n E 25:PWMCAE 寄存器(控制对齐) CAEx=1 居中对齐;CAx=0 左对齐。
6:PWMCTL 寄存器(控制串联) CON67=1 6、7串为同一输出,7主导。
PSWAI=1 等待+时钟停止输入;PSWAI=0 等待+时钟输入。
7:PWMSCLA 寄存器(对A 时钟分频产生SA 时钟)Clock SA=Clock A /(2*PWMSCLA) PWMSCLB 同理8: PWMCNTx 寄存器(控制计数) 8个9:PWMPERx (8个控制周期)1) 当CAEx=0时,即进行左线性输出时: PWMx 周期=通道时钟周期*PWMPERx2) 当CAEx=1时,即进行居中对齐输出时:PWMx 周期=通道时钟周期*(2*PWMPERx )10:PWMDTYx 寄存器(控制占空比)当PPOL=0时:占空比=[(PWMPERx —PWMDTYx)/ PWMPERx]*100%当PPOL=1时:占空比=(PWMDTYx/ PWMPERx)*100%3.2 PWM初始化步骤总结1、禁止PWM Disable PWMPWME=0;2、选择时钟Select clock (prescaler and scale) for the PWMPWMPRCLK,PWMSCLA,PWMSCLB,PWMCLK3、选择极性Select polarityPWMPOL4、选择对齐模式Select center or left aligned modePWMCAE5、对占空比和周期编程Program duty cycle and periodPWMDTYx,PWMPERx6、使能PWM通道Enable used PWM channelsPWME3.3 PWM应用实例例1:输出占空比为25%的波形(1)实验设备:HCS12编程器、开发板、示波器(2)软件程序设计:本例子是输出占空比为25%,周期为500Hz的波形。
PWM模块介绍
该教程以MC9S12DG128单片机为核心进行讲解,全面阐释该16位单片机资源。
本文为第一讲,开始介绍该MCU的PWM模块。
PWM 调制波有8个输出通道,每一个输出通道都可以独立的进行输出。
,一个周期控制寄每一个输出通道都有一个精确的计数器(计算脉冲的个数)
存器和两个可供选择的时钟源。
每一个P WM 输出通道都能调制出占空比从0—100% 变化的波形。
PWM 的主要特点有:
1、它有8个独立的输出通道,并且通过编程可控制其输出波形的周期。
2、每一个输出通道都有一个精确的计数器。
3、每一个通道的P WM 输出使能都可以由编程来控制。
4、PWM 输出波形的翻转控制可以通过编程来实现。
5、周期和脉宽可以被双缓冲。
当通道关闭或PWM 计数器为0 时,改变周期和脉宽才起作用。
6、8 字节或16 字节的通道协议。
,他们提供了一个宽范围的时
7、有4个时钟源可供选择(A、SA、B、SB)
钟频率。
8、通过编程可以实现希望的时钟周期。
9、具有遇到紧急情况关闭程序的功能。
10、每一个通道都可以通过编程实现左对齐输出还是居中对齐输出。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
STM8学习笔记——PWM模块
首先将管脚配置为推挽输出。
下面以向上计数模式为例来讲述PWM 产生的原理:TIMx 开始向上计数,TIMx_CNT 为计数值,计数一次加
1,TIMx_ARR 确定了计数的上限,达到上限后计数器从0 开始重新计数,所
以一次PWM 频率就由TIMx_ARR 来确定了,即计数器时钟*(TIMx_ARR-1),
频率确定了,接下来就是占空比。
占空比是由TIMx_CCRx 来确定的,PWM
模式1 下当TIMx_CNT=TIMx_CCRx 时,输出OCiREF 无效电平,至于有效电平是0 还是1,要设置TIMx_CCERx,这样产生了一个PWM 波形,可以说配置非常灵活,当TIMx_CCRx 为0 时,占空比就为0,当TIMx_CCRx 大于TIMx_ARR 时,就一直输出高电平(占空比100%)。
下图是个例子:
以下是我写的一个参考程序,测试通过
void TIM1_Init(void){//定时器1 初始化CLK_PCKENR1|=0x80;//开启定时器1 外设时钟TIM1_EGR=0x01;//重新初始化TIM1 TIM1_EGR|=0x20;//重新初始化TIM1 TIM1_ARRH=0x00;//设定重装载值TIM1_ARRL=254; TIM1_PSCRH=0;//预分频TIM1_PSCRL=9; TIM1_CR1=0;//边沿对齐,向上计数} void TIM1_PWM_Init(){ //TIM1_CCER1=0x03;//低电平有效//TIM1_CCMR1=0x70;//PWM 模式2TIM1_CCER1=0x01;//高电平有效
TIM1_CCMR1=0x60;//PWM 模式1
TIM1_CCR1H=0;//占空比TIM1_CCR1L=50; TIM1_CR1|=0x01;//向上计数,无缓存,使能TIM1_BKR=0x80;//开启刹车}
tips:感谢大家的阅读,本文由我司收集整编。
仅供参阅!。