【STM8学习笔记1】 一步步学习 使用TIM1测量PWM波
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模块
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 模式1TIM1_CCR1H=0;//占空比TIM1_CCR1L=50; TIM1_CR1|=0x01;//向上计数,无缓存,使能TIM1_BKR=0x80;//开启刹车}tips:感谢大家的阅读,本文由我司收集整编。
一些主从定时器相关,PWM波精确控制步进电机的笔记
⼀些主从定时器相关,PWM波精确控制步进电机的笔记1、步进电机 以滚珠丝杆为例,作假设如下: ①步进电机与滚珠丝杆的减速⽐是2:1; ②丝杆转⼀圈所移动的距离是2mm; 通过上⾯的1和2,我们可以得出我们需要的东西:步进电机转1圈所对应的移动距离是1mm。
步进电机通过PWM波输⼊来控制其输出速度,步进的意思是每⼀个PWM脉冲会使电机前进/后退1步。
步进细分数就是关联脉冲与电机速度的重要参数。
这⾥假设细分数是1000步,意思就是,每1000个脉冲会使步进电机转动⼀圈,倒过来讲就是每1个PWM脉冲,会使步进电机运动0.001步,也就是转动0.001圈。
这就是我们需要的第⼆个东西,把这两个放⼀起,可以看到如下: ③步进电机转1圈所对应的移动距离是1mm; ④每1个PWM脉冲,会使步进电机运动0.001步,也就是转动0.001圈; 通过上⾯3和4,我们可以得出:每1个PWM脉冲,会使运动机构运动0.001mm。
2、定时器中断与PWM输出 我们都知道,PWM的输出是CNT和CCRx寄存器⽐较的结果,所以只要配置好PSC、ARR和CCRx,就可以确定输出PWM的频率,公式是: PWM频率 = APBx的频率/(PSC+1)*(ARR+1) 占空⽐ = CCRx/ARR * 100% 为了输出占空⽐为50%的⽅波,我们令CCRx=ARR/2。
这样就可以确定输出频率了,频率其实就是每秒的脉冲数,⽐⽅说100HZ,其代表的就是100脉冲/秒。
⽽我们在前⾯2⾥头已经知道了,在这套假设的系统中,1个脉冲对应运动机构实际运⾏0.001mm,那么1000HZ就代表,在这个频率下,运动机构的运动速度是1mm/s。
到这⾥我们就可以知道如何控制速度了,我们按1个脉冲为最⼩单位,即0.001mm/s 的速度,在不考虑失步的情况下,我们的实际速度就能从0.001mm/s到任意⼤的区间⾥⾃由选择了,其控制精度为0.001mm/s。
关于STM32的 一个TIM1 的PWM程序和PWM简单使用
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;//先不管
TIM_OC1Init(TIM1,TIM_OCInitStructure); //数初始化外设TIMx通道1这里2.0库为TIM_OCInit
中止PB12。
如果输出与互补输出极性相同的话就刚好输出高互补低至于PWM模式1与模式2的区别
在下图:
这个是模式1的了绿为输出黄为互补
*************************************************************************************************
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
/*配置TIM1*/
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
voidTim1_Configuration(void)
TIM_OCInitStructure.TIM_Pulse = 40; //占空时间144中有40的时间为高,互补的输出正好相反
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low; //互补端的极性
如何测量PWM波
如何测量PWM波的占空比?硬件: Digital I/O (DIO)问题:PWM波是占空比可调的周期性数字脉冲,广泛应用于电机控制、温度控制等领域。
PWM波的关键参数是占空比,那么有哪些方式可以测量PWM波的占空比呢?解答:NI的数据采集板卡提供了模拟采集、数字IO、计数器等丰富测量资源,不同资源下都能完成PWM波的测量,同时R系列的FPGA板卡和cRIO也可以测量,各种方案实现方式如下:a)利用计数器测量占空比最简单的方案是采用计数器半周期测量,支持的计数器需要有双边沿分离检测的特性,支持的板卡包括 M系列(STC2核心)、X系列(STC3核心)数据采集卡、定时器/计数器板卡(NI-TIO核心)和部分C模块(DIO数目≤8)等,通常32位宽的计数器都支持该测量。
该方案通过预设半周期时间可以得到非常高精度的测量结果。
参考Help/Hardware Input and Output/DAQmx/Counter Measurements/Period or Pluse Width /Meas Duty Cycle-Buffered-Finite.vi。
(cDAQ 9174,9178有四个计数器,每个槽都可以使用计数器资源,而cDAQ-9172只有5槽和6槽可以使用计数器资源)图1 一个计数器测量占空比对于带2个24位计数器的板卡,不具有双边沿分离检测,如PXI-6133,可以采用脉冲宽度测量,分别测量高脉宽时间和低脉宽时间,从而计算占空比。
参考Help/Hardware Input and Output/DAQmx/Counter Measurements/Period or Pluse Width / Meas Pulse Width-Buffered-Finite.vi。
图2 两个计数器测量占空比b)利用模拟采集测量占空比该方案主要使用波形测量选板中的脉冲测量VI,可以根据周期性的采集数据计算占空比。
STM8教程实验8-定时器TIM1
STM8教程实验8-定时器TIM1例程⼋ TIM1这⼀节,我们将向⼤家介绍如何使⽤STM8的定时器中的基本定时功能,STM8的定时器功能⼗分强⼤,有TIM1⾼级定时器,也有TIM2、TIM3等通⽤定时器,还有TIM4基本定时器。
在STM8S参考⼿册⾥⾯,定时器的介绍占了1/3的篇幅,⾜见其重要性。
这⼀节,我们分别介绍TIM1的基本定时功能16位⾼级控制定时器(TIM1)简介:TIM1由⼀个16位的⾃动装载计数器组成,它由⼀个可编程的预分频器驱动。
TIM1有4个通道,分别是1到4。
分别对应于四个不同的捕获/⽐较通道。
⾼级控制定时器适⽤于许多不同的⽤途:基本的定时测量输⼊信号的脉冲宽度(输⼊捕获)产⽣输出波形(输出⽐较,PWM和单脉冲模式)对应与不同事件(捕获,⽐较,溢出,刹车,触发)的中断与TIM5/TIM6或者外部信号(外部时钟,复位信号,触发和使能信号)同步⾼级控制定时器⼴泛的适⽤于各种控制应⽤中,包括那些需要中间对齐模式PWM的应⽤,该模式⽀持互补输出和死区时间控制。
⾼级控制定时器的时钟源可以是内部时钟,也可以是外部的信号,可以通过配置寄存器来进⾏选择。
TIM1的时基单元包括,如下图所⽰:● 16位向上/向下计数器● 16位⾃动重载寄存器●重复计数器●预分频器16位计数器,预分频器,⾃动重载寄存器和重复计数器寄存器都可以通过软件进⾏读写操作。
⾃动重载寄存器由预装载寄存器和影⼦寄存器组成。
可在在两种模式下写⾃动重载寄存器:●⾃动预装载已使能(TIM1_CR1寄存器的ARPE位置位)。
在此模式下,写⼊⾃动重载寄存器的数据将被保存在预装载寄存器中,并在下⼀个更新事件(UEV)时传送到影⼦寄存器。
●⾃动预装载已禁⽌(TIM1_CR1寄存器的ARPE位清除)。
在此模式下,写⼊⾃动重载寄存器的数据将⽴即写⼊影⼦寄存器。
更新事件的产⽣条件:●计数器向上或向下溢出。
●软件置位了TIM1_EGR寄存器的UG位。
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)。触发信号为上升沿
STM8教程实验8-定时器TIM1
例程八 TIM1这一节,我们将向大家介绍如何使用STM8的定时器中的基本定时功能,STM8的定时器功能十分强大,有TIM1高级定时器,也有TIM2、TIM3等通用定时器,还有TIM4基本定时器。
在STM8S参考手册里面,定时器的介绍占了1/3的篇幅,足见其重要性。
这一节,我们分别介绍TIM1的基本定时功能16位高级控制定时器(TIM1)简介:TIM1由一个16位的自动装载计数器组成,它由一个可编程的预分频器驱动。
TIM1有4个通道,分别是1到4。
分别对应于四个不同的捕获/比较通道。
高级控制定时器适用于许多不同的用途:基本的定时测量输入信号的脉冲宽度(输入捕获)产生输出波形(输出比较,PWM和单脉冲模式)对应与不同事件(捕获,比较,溢出,刹车,触发)的中断与TIM5/TIM6或者外部信号(外部时钟,复位信号,触发和使能信号)同步 高级控制定时器广泛的适用于各种控制应用中,包括那些需要中间对齐模式PWM的应用,该模式支持互补输出和死区时间控制。
高级控制定时器的时钟源可以是内部时钟,也可以是外部的信号,可以通过配置寄存器来进行选择。
TIM1的时基单元包括,如下图所示:● 16位向上/向下计数器● 16位自动重载寄存器● 重复计数器● 预分频器16位计数器,预分频器,自动重载寄存器和重复计数器寄存器都可以通过软件进行读写操作。
自动重载寄存器由预装载寄存器和影子寄存器组成。
可在在两种模式下写自动重载寄存器:● 自动预装载已使能(TIM1_CR1寄存器的ARPE位置位)。
在此模式下,写入自动重载寄存器的数据将被保存在预装载寄存器中,并在下一个更新事件(UEV)时传送到影子寄存器。
● 自动预装载已禁止(TIM1_CR1寄存器的ARPE位清除)。
在此模式下,写入自动重载寄存器的数据将立即写入影子寄存器。
更新事件的产生条件:●计数器向上或向下溢出。
●软件置位了TIM1_EGR寄存器的UG位。
●时钟/触发控制器产生了触发事件。
Stm8s定时器TIM1的编码模式与旋转开关的接口.docx
Stm8s定时器TIM1的编码模式与旋转开关的接口Stm8s只有定时器一有编码模式,硬件根据两个通道CH1和CH2进来相位的关系,计数器自动加减。
不需要再通过外部中断来进行旋转编码。
一共有三种工作模式。
1•计数器只在TI2的边沿计数,则置TIMx_SMCR寄存器中的SMS=001 ;2•只在TI1边沿计数,则置SMS=010;3•计数器同时在TI1和TI2边沿计数,则置SMS=011。
代码CLK->PCKENR1 |=0X80; // 开启timel 时钟TIM1->SMCR |= 0X02; //工作在编码器模式2TIM1->CCMR1 |= 0X1; //IC1FP1 映射到TI1)TIM1->CCMR2 |= 0X1; //IC2FP2 映射到TI2 CC2 MAP TI2FP2 CH2 TIM1->ARRH = 0XEA; // 60000 产生溢出最大65535TIM1->ARRL = 0X60;TIM1->IER |=0X1; 〃开中断,开中断前要有中断处理程序,中断里需要清除中断标志位TIM1->CNTRH = Oxea; / /我要有个大的初始化值TIM1->CNTRL=0x56;TIM1->CR1 =0X01; // 启动计数中断处理程序#pragma vector=0x0d__in terrupt void TIM1_UPD_OVF_TRG_BRK_IRQHa ndler(void){TIM1_ClearITPe ndin gBit(TIM1_IT_UPDATE);if((TIM1->CR1 &0 x10)!=0)coun t2--;elsecoun t2++;}当计数寄存器(TIM1_CNTR )里的计数值到由TIM1->ARR到0时, 开中断的话,会产生溢出中断,根据读TIM1->CR1里的DIR位可以读出方向,DIR位等于1向下计数,DIR等于0向上计数(此时的DIR只读)普通旋转编码开关的的波形。
STM8S208MB——TIM1输入捕获周期频率测量(中断方式)
STM8S208MB——TIM1输入捕获之周期频率测量(中断方式)用查询标记的方式等待TIM1_SR1标记位,如果为0说明没有捕获到边沿;如果为1说明已经捕获到边沿信号,硬件产生中断,标记位置1,此时可以读取TIM1_CCR1,可以读取计数器的值……。
此方式效率很低,并且还有一个严重的弊端,如果外部没有信号输入时,软件会进入查询死循环一直等待,CPU不能处理任何事情,实际应用开发中基本用不上。
经过几天的摸索,输入捕获采用中断的方式来测量频率可以完美解决上述问题,如果外部没有信号输入,软件进入main函数的大循环中运行,有信号时进入断处理。
需要注意的是,输入引脚必须加上拉电阻,防止没有信号输入时,线路上在的干扰信号造成测量到乱信号。
以下是一个简易的车子时速测量程序,例如车轮里面有24个磁铁,一个霍尔传感器,传感器产生24个脉冲就是轮子转一圈,根据这个脉冲信号来测量车子的行驶时速,因此需要用上输入捕获频率测量。
在磁铁的驱动下霍尔传感器产生的频率并不高,如果车轮周长为1米,采集到的输入信号频率是1KHz,那么时速就可以达到150km,这种情况很少见。
车子慢速行驶时可能频率只有几个Hz可能试着计算下,24个脉冲(Hz)为轮子转一圈,1000Hz/24=41.7,但这是秒速,实际上这个值还要乘以轮子的周长再乘以3600秒才是时速。
因为频率过低,如果计数器不配置预分频器基本测不到,因此配置寄存器时要特别注意。
F master频率为16MHz,假如TIM1计数器预分频值给800,这样TIM1的工作频率就是20000Hz,即计数器每秒走20000次,计数器的最大值0-65535,可以估算下,TIM1计数器走完65535差不多得3秒多的时间。
这样看来,如果我们用复位触发模式,输入的信号周期为3秒或以下的是可以测量出来的,但是不可以太小,如果输入信号的周期时间小于1/20000Hz的话肯定测量不准确,需要注意的是,采样频率至少大于输入信号频率的四倍以上测量才可能更准确。
pwm工作的基础原理及应用
PWM工作的基础原理及应用什么是PWM?PWM (Pulse Width Modulation) 是一种通过控制信号的占空比来控制电平的技术。
通过改变信号的高电平与低电平持续时间的比例,PWM技术可以模拟模拟信号,实现对设备的精确控制。
PWM的基本原理PWM技术是通过周期性调制信号来模拟模拟信号。
通常情况下,PWM信号的周期是固定的,但是信号的高电平和低电平持续时间可以根据需求进行改变。
通过改变占空比(高电平持续时间与周期之比),可以控制输出信号的有效值,实现对设备的控制。
PWM的工作过程1.设置PWM周期和频率2.设置占空比3.产生PWM信号PWM的应用1. 电机控制•直流电机控制:通过调整PWM信号的占空比,可以实现对直流电机的转速控制。
•交流电机控制:通过将PWM信号与交流电源进行整流和滤波处理,可以实现对交流电机的转速控制。
2. 电源管理•DC-DC转换器:PWM技术广泛应用于DC-DC转换器中,通过调整占空比来调整输出电压。
•电池充放电:PWM技术可以在充放电过程中实现对电池的控制,如恒流充电、恒压充电等。
3. LED调光•PWM技术被广泛用于LED调光控制,通过调整PWM信号的占空比来改变LED的亮度。
4. 温度控制•PWM技术可以通过调整占空比来控制加热器的功率,从而实现温度的控制。
5. 音频处理•PWM技术可以用于音频信号的数字处理,通过将音频信号转化为PWM信号,可以实现音频的放大和滤波。
6. 无线通信•PWM技术可以用于无线通信中的调制和解调,通过改变PWM信号的占空比来实现数字信号的传输。
7. 传感器信号调节•PWM技术可以对传感器信号进行调节,通过改变PWM信号的占空比来调整传感器的灵敏度。
总结通过对PWM技术的学习和应用,我们可以实现对各种设备的精确控制。
无论是电机控制、电源管理还是其他领域,PWM技术都发挥着重要的作用。
希望通过本文的介绍,可以帮助读者更好地理解PWM技术的基础原理和应用。
STM8S的TIM1PWM设置(寄存器版本)
STM8S的TIM1PWM设置(寄存器版本)
在TIM1_CCMRi寄存器中的OCiM位写入’110’(PWM模式1)或’111’(PWM模式2),能够独立地设置每个OCi输出通道产生一路PWM。
必须设置IM1_CCMRi寄存器的OCiPE位使能相应的预装载寄存器,也可以设置TIM1_CR1寄存器的ARPE位使能自动重装载的预装载寄存器(在向上计数模式或中央对称模式中)。
由于仅当发生一个更新事件的时候,预装载寄存器才能被传送到影子寄存器,因此在计数器开始计数之前,必须通过设置TIM1_EGR 寄存器的UG位来初始化所有的寄存器。
OCi的极性可以通过软件在TIM1_CCERi寄存器中的CCiP位设置,它可以设置为高电平有效或低电平有效。
OCi的输出使能通过(TIM1_CCERi和TIM1_BKR寄存器中)CCiE、MOE、OISi和OSSR 位和OSSI位的组合来控制。
详见TIM1_CCERi寄存器的描述。
在PWM模式(模式1或模式2)下, TIM1_CNT和TIM1_CCRi始终在进行比较,(依据计数器的计数方向)以确定是否符合TIM1_CCRi≤TIM1_CNT或者TIM1_CNT≤TIM1_CCRi。
根据TIM1_CR1寄存器中CMS位域的状态,定时器能够产生边沿对齐的PWM信号或中央对齐的PWM信号。
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);}}}。
PWM波的原理及实际应用
PWM波的原理及实际应用1. 什么是PWM波?PWM(Pulse Width Modulation)是脉宽调制的缩写,是一种在数字电子中使用的一种调制方式。
它可以将不同频率和占空比的信号合成一个数字信号输出。
2. PWM波的原理PWM波是通过不同占空比的方波脉冲信号来模拟模拟信号的一种调制方式。
在PWM波中,方波的宽度是固定的,但占空比可以根据需要调节。
PWM波的输出是由一个基准频率和一个具有不同占空比的方波脉冲信号组成的。
占空比表示方波信号中高电平所占的时间与一个周期的时间比例。
例如,一个50%的占空比表示高电平的时间等于一个周期时间的一半。
3. PWM波的应用3.1 转换器控制PWM波广泛应用于各种类型的转换器控制中,包括DC-DC转换器和AC-DC转换器。
通过调整PWM波的占空比,可以控制转换器的输出电压和电流。
3.2 电机控制PWM波被广泛应用于电机控制中,特别是直流电机和步进电机。
通过改变PWM波的占空比,可以控制电机的转速和转向。
3.3 照明控制PWM波在照明控制中也有广泛的应用。
通过改变PWM波的占空比,可以控制灯的亮度。
这种方式比传统的调光方式更加高效和节能。
3.4 音频处理PWM波还可以用于音频处理。
在数字音频系统中,PWM波可以模拟模拟音频信号,从而实现音频的数字化和信号处理。
4. PWM波的优点4.1 简单高效PWM波的产生和控制非常简单,只需要一个计时器和一个比较器即可。
这使得PWM波成为一种非常高效的信号调制方式。
4.2 精确控制通过改变PWM波的占空比,可以实现对电压、电流、亮度等的精确控制。
这使得PWM波在工业控制和调整中非常有用。
4.3 低功耗PWM波相对于其他调制方式来说,功耗非常低。
因为只有在高电平时才会有电流流过,而在低电平时几乎没有电流流过。
4.4 高抗干扰性PWM波在传输过程中具有较高的抗干扰性。
传输过程中,一旦脉冲信号丢失,由于脉冲宽度较大,临界点的波形扰动对结果影响较小,因此抗干扰性较强。
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系列标准固件库来驱动通用外设的功能。
STM8STIM1PWM初始化设置
STM8STIM1PWM初始化设置#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_PINENBLE @TIM1_CCER1:4 ;//TIM1_CH2 -- PC7_Bool PWMCOUT_PINENBLE @TIM1_CCER2:0 ;//TIM1_CH3 -- PC3// PWM 频率设定#define V_PWMFRE 1000#define ToCMPxH(CMP,Value) (CMP = (uint8)((Value >> 8 ) & 0xFF))#define T oCMPxL(CMP,Value) (CMP = (uint8)(Value & 0xFF))//*************************************// 函数名称:Init_Timer1_PWM// 函数功能:定时器1作PWM输出时初始化// 入口参数:PWM等级每级0.625U (1000*0.625 = 62.5U = 8K)// 出口参数:无// 此初始化设置应用在BLDC 三相PWM输出//***************************************void Init_Timer1_PWM(uint16 Tcon,uint16 Pscr) {//16M系统时钟经预分频f=fck/(PSCR+1)TIM1_PSCRH = (Pscr >> 8) & 0xff ;TIM1_PSCRL = Pscr & 0xff ;//设定重装载时的寄存器值,255是最大值TIM1_ARRH = (T con >> 8) & 0xff ;TIM1_ARRL = Tcon & 0xff ;//设置刹车寄存器TIM1_BKR|=0X80 ;//PWM1模式,TIM1_CNT<TIM1_CCR1时有效TIM1_CCMR1 =0x6C ;//PWM1模式,TIM1_CNT<TIM1_CCR1时有效TIM1_CCMR2 =0x6C ;//PWM1模式,TIM1_CNT<TIM1_CCR1时有效TIM1_CCMR3 =0x6C ;//冻结模式,TIM1_CNT<TIM1_CCR1时有效TIM1_CCMR4 =0x08 ;//PWM 占空比清0TIM1_CCR1H = 0;TIM1_CCR1L = 0;TIM1_CCR2H = 0;TIM1_CCR2L = 0;TIM1_CCR3H = 0;TIM1_CCR3L = 0;TIM1_EGR = 0X01 ; //UG = 1 ;初始化计数器预装载载入影子寄存器中TIM1_CNTRH = 0 ; //计数器清0TIM1_CNTRL = 0 ;TIM1_CR1 |= 0X01; // 计数器使能,开始计数}//*************************************// 函数名称:TOPWMVALUE// 函数功能:设置PWM占空比// 入口参数:占空比值// 出口参数:无//***************************************void TOPWMVALUE(uint16 OUT_PWM){ToCMPxH(TIM1_CCR1H,OUT_PWM);ToCMPxL(TIM1_CCR1L,OUT_PWM);ToCMPxH(TIM1_CCR2H,OUT_PWM);ToCMPxL(TIM1_CCR2L,OUT_PWM);ToCMPxH(TIM1_CCR3H,OUT_PWM);ToCMPxL(TIM1_CCR3L,OUT_PWM);}//----实例应用------//定时器1初始化Init_Timer1_PWM(V_PWMFRE,TIM1_DIV2) ;//16M/2=8M 设置8K PWM输出。
【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);
STM8TIM定时器要点
STM8TIM定时器要点STM8 TIM 定时器使用要点:1、分频:TIM1 可以在(1~65536)之间任意分频:Fck_cnt=Fck_psc/(PSCR[15:0]+1)先写高字节,后写低字节,更新事件后生效。
TIM2/TIM3/TIM5 可以在(1~32768)之间以2的幂分频:Fck_cnt=Fck_psc/(2^(PSCR[3:0]))更新事件后生效。
2、预装载:ARR/OCiR预装载允许时(ARPE=1 OCiPE=1),写入的寄存器值不会直接进入影子寄存器,需要发生一次更新事件后,才生效。
ARR/OCiR预装载禁止时(ARPE=0 OCiPE=0),写入的寄存器值直接进入影子寄存器,立即生效,因此可能造成第一次的波形不正常。
3、更新:置位TIMx_EGR的UG位可以软件生成一个更新事件。
向上计数方式时,CNT从ARR跳变到0时产生更新事件。
向下计数方式时,CNT从0跳变到ARR时产生更新事件。
向上/向下计数方式时(中央对齐模式),OCRi寄存器的值是比较值(OCiREF的有效时间)的一半,ARR寄存器的值是实际周期值(不用-1)的一半,CNT从ARR-1增加到ARR时产生上溢事件,CNT从1减少到0时产生下溢事件。
安全使用中央对齐模式的计数器的方法是在启动计数器之前先用软件(置位TIM1_EGR寄存器的UG位)产生一个更新事件,并且不在计数器计数时修改计数器的值。
4、PWM模式:PWM边沿对齐PWM1模式,向上计数时,CCRx正确取值范围为(0~ARR):CCRx=0 时,产生全无效电平(产生占空比为0%的PWM波形)。
CCRx<=ARR 时,产生CCRx个有效电平(产生占空比为CCRx/(ARR+1)*100% 的PWM波形)。
CCRx>ARR 时,产生全有效电平。
PWM边沿对齐PWM1模式,向下计数时,CCRx正确取值范围为(0~ARR):CCRx=0 时,不能产生占空比0% 的PWM波形(产生占空比为1/(ARR+1)*100%的PWM波形)。
如何测量PWM波
如何测量PWM波的占空比?硬件: Digital I/O (DIO)问题:PWM波是占空比可调的周期性数字脉冲,广泛应用于电机控制、温度控制等领域。
PWM波的关键参数是占空比,那么有哪些方式可以测量PWM波的占空比呢?解答:NI的数据采集板卡提供了模拟采集、数字IO、计数器等丰富测量资源,不同资源下都能完成PWM波的测量,同时R系列的FPGA板卡和cRIO也可以测量,各种方案实现方式如下:a)利用计数器测量占空比最简单的方案是采用计数器半周期测量,支持的计数器需要有双边沿分离检测的特性,支持的板卡包括 M系列(STC2核心)、X系列(STC3核心)数据采集卡、定时器/计数器板卡(NI-TIO核心)和部分C模块(DIO数目≤8)等,通常32位宽的计数器都支持该测量。
该方案通过预设半周期时间可以得到非常高精度的测量结果。
参考Help/Hardware Input and Output/DAQmx/Counter Measurements/Period or Pluse Width /Meas Duty Cycle-Buffered-Finite.vi。
(cDAQ 9174,9178有四个计数器,每个槽都可以使用计数器资源,而cDAQ-9172只有5槽和6槽可以使用计数器资源)图1 一个计数器测量占空比对于带2个24位计数器的板卡,不具有双边沿分离检测,如PXI-6133,可以采用脉冲宽度测量,分别测量高脉宽时间和低脉宽时间,从而计算占空比。
参考Help/Hardware Input and Output/DAQmx/Counter Measurements/Period or Pluse Width / Meas Pulse Width-Buffered-Finite.vi。
图2 两个计数器测量占空比b)利用模拟采集测量占空比该方案主要使用波形测量选板中的脉冲测量VI,可以根据周期性的采集数据计算占空比。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(原文件名:111.png) 根据上图所示测量PWM的基本思想如下: 每个上升沿开始计数,监测到下降沿时记录下当前值为高电平时间,再检测到一个下降沿记 录下当前值为周期,同时清零计数器开始测量下个周期。
二 TIM1 的硬件结构 1 信号如何输入的
打开手册 翻到
(原文件名:2.jpg)
三 寄存器 1配置信号输入路径 点击手册目录 从TIM1寄存器描述的目录中找 输入捕获相关的寄存器。 这里发现有4个 CCMRx 正好和框图中四个TIM输入通道对应上了。通过介绍了解 是用来控制信号输入路径的。
位 1:0
我的实验板上信号输入的引脚是TH2,那么就该把TH2分成两路分别连接到TIM1的 两个通道上(IC1,IC2) TIM1->CCMR1 |=0x02;// ch1 到 ti2fp1 TIM1->CCMR2 |=0x01;// ch1 到 ti2fp1
和触发方式 复位
TIM1->CCMR2 |=0x01;// ch1 到 ti2fp1 TIM1->CCER1 |= 0x13;//使能输入捕获 ti2fp1 ti2fp2 ti2fp1 下降升沿 ti2fp2 上升沿
//中断 TIM1->IER |=0x06;//使能中断 ch1 ch2
TIM1_Cmd(ENABLE); }
那么我们就可以将一个引脚输入的PWM信号的上升沿和下降沿分别送入两个通道捕 获。
2触发 如果是用的普通的计时器例如古董51的话,计时器清零的步骤就可以在上升沿中断的时候 手动清零,不过STM8 的TIM1有个复位触发模式很适用:
计数器开始依据内部时钟计数,然后正常计数直到 TI1 出现一个上升沿;此时,计数器被清 零然后从 0 重新开始计数。同时,触发标志(TIM1_SR1 寄存器 的 TIF 位)被置位,如果使能 了中断(TIM1_IER 寄存器的 TIE 位),则产生一个中断请求。 下图显示当自动重装载寄存器 TIMx_ARR=0x36 时的动作。在 TI1 上升沿和计数器的实际复位之间的延时取决于 TI1 输入端 的重同步电路。
将 PWM 波注入 CH2 引脚。在中断返回前设置断点,然后进行仿真, 将 IC2Value,IC1Value;放入 watch 窗口观察。 void TIME1_INIT(void) {
TIM1_DeInit(); //时基单元
//时钟触发控制器 TIM1->SMCR |=0X64;//选源触发源 ti2fp2 //捕获 比较 TIM1->CCMR1 |=0x02;// ch1 到 ti2fp1
return; }
//读取周期
2 设置捕获极性 信号已经连到 IC1 IC2 了,那么下一步就该对 IC1 IC2 进行配置了。顺着目录往下看跟捕获 相关的寄存器还有 CCERx 通过阅读描述了解该为可控制 ICx 的捕获边沿极性和使能。
实验中的配置如下 TIM1->CCER1 |= 0x13;//使能输入捕获 ti2fp1 ti2fp2 沿捕获
ti2fp1 下降沿捕获 ti2fp2 上升
3 触发模式 从模式控制寄存器 SMCR 中可选择复位模式和 触发源 TIM1->SMCR |=0X64;//选源触发源 ti2fp2 触发方式 复位模式
最后使能下中断配置就大功搞成咯 TIM1->IER |=0x06;//使能中断 ch1 ch2
四 测试程序 STVD
void main(void) {
TIME1_INIT();
// 定时器 1 输入捕获初始化
enableInterrupts(); // 开总中断
while(1);
}
中断函数 extern unsigned int IC2Value,IC1Value;
@near @interrupt void TIM1_CAP_COM_IRQHandler (void) {
17.5.2 输入模块
(原文件名:1.jpg)
如图 61,输入部分对相应的 TIx 输入信号采样,并产生一个滤波后的信号 TIxF。然后, 一个带极性选择的边缘监测器产生一个信号(TIxFPx),它可以作为触发模式控制器的输入触 发或者作为捕获控制。该信号通过预分频进入捕获寄存器(ICxPS)。
根据该图和说明了解到和 PWM 测量相关的信息 1) TIM1有四个外部 IO 引脚可以输入信号 TIM1_一个输入信号的上升沿 下降沿信号(TI1FP1,TI1FP2)可以配置到不同的通道 上
if(TIM1_GetITStatus(TIM1_IT_CC1)) {
IC1Value=TIM1_GetCapture1(); TIM1_ClearITPendingBit(TIM1_IT_CC1);
//读取高电平时间
} if(TIM1_GetITStatus(TIM1_IT_CC2)) { TIM1_ClearITPendingBit(TIM1_IT_CC2); IC2Value=TIM1_GetCapture2(); }