STM8 TIM1 PWM输入捕获学习
STM8_TIM1_PWM输入捕获学习
TIM1->CCER1 |= 0x11;//使能输入捕获1,2 TIM1_Cmd(ENABLE); 最后才将定时器使能
}
中断里的程序 if(TIM1_GetITStatus(TIM1_IT_CC1)) { TIM1_ClearITPendingBit(TIM1_IT_CC1); IC1Value=TIM1_GetCapture1(); i++; if(i==0xff) i=0; } if(TIM1_GetITStatus(TIM1_IT_CC2)) { TIM1_ClearITPendingBit(TIM1_IT_CC2); IC2Value=TIM1_GetCapture2(); i++; if(i==0xff) i=0;
注:CC1S仅在通道关闭时(TIM1_CCER1寄存器的CC1E=0)才是可写的。 就是说使能tim1的时候 不能配置相关寄存器
根据图2 可知选择 ห้องสมุดไป่ตู้I1FP1 01值 TIM1->CCMR1 |= 0x01;即可
当发生一个输入捕获时: 当发生一个输入捕获时: 当产生有效的电平转换时,计数器的值被传送到TIM1_CCR1寄存 器。 CC1IF标志被设置(中断标志)。当发生至少2个连续的捕获时,而 CC1IF未曾被清除时,CC1OF也被置1。 如设置了CC1IE位,则会产生一个中断。 为了处理捕获溢出(CC1OF位),建议在读出重复捕获标志之前读 取数据, 这是为了避免丢失在读出捕获溢出标志之后和读取数据之前 可能产生的重复捕获信息。
输入捕获无非就是检验相同的一个或者几个边沿根据差值再按照一定得运算求出输入波形的周期信息这里每个通道每次只能配置为不是上升沿就是下降沿
Stm8 tim1 pwm 输入捕获学习笔记 -------------计算周期和占空比 作者 萧星
STM教程STMS定时器模块及其应用实例
S T M教程S T M S定时器模块及其应用实例集团标准化工作小组 [Q8QX9QT-X8QQB8Q8-NQ8QJ8-M8QMN]第十三章 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 位置位)。
带你学习STM8自带输入捕获功能
带你学习STM8自带输入捕获功能
最近在用STM8的过程中需要用到一个频率检测的功能,还好
STM8S207的定时器中自带有输入捕获功能,之前还想着用定时器计数方式来实现的,但既然人家提供了该功能,那就试试吧,由于硬件里面接的是PC1引脚就只看了Timer1,其他的定时器应该也是类似的,看了资料之后发现STM8的输入捕获其实与STC12C5A60S2中的PCA捕获模式很类似,但是看资料没有后者清晰易懂。
在捕获模式中,基本上只用到了读进程,在STM8中有一个影子寄存器,但对于我们来说是看不到的,我们仅操作预装载寄存器即可。
而且需要注意的是无论是计数器还是捕获/比较寄存器都是先读/写高8位,后读/写低8位数据。
在文档中给出了一个输入捕获模式的流程
[cpp] view plain copyTIM1_CCER1 &= (unsigned char)~0x02;//上升沿或者高电平触发。
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输入捕获频率学习笔记陈宏敏2013-5-251、PWM:脉冲宽度调制,英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。
简单一点,就是对脉冲宽度的控制。
2、STM32的定时器除了TIM6和TIM7。
其他的定时器都可以用来产生PWM输出。
其中高级定时器TIM1和TIM8可以同时产生多达7路的PWM输出。
而通用定时器也能同时产生多达4路的PWM输出,这样STM32最多可以同时产生30路PWM输出!等下我用TIM2的CH2产生一路PWM输出和PWM输入。
3、要使STM32的通用定时器TIMx产生PWM输出,我们会用到3个寄存器,来控制PWM。
这三个寄存器分别是:捕获/比较模式寄存器(TIMx_CCMR1/2)、捕获/比较使能寄存器(TIMx_CCER)、捕获/比较寄存器(TIMx_CCR1~4)。
(注意,还有个TIMx的ARR寄存器是用来控制pwm的输出频率)。
首先是捕获/比较模式寄存器(TIMx_CCMR1/2),该寄存器总共有2个,TIMx _CCMR1和TIMx _CCMR2。
TIMx_CCMR1控制CH1和2,而TIMx_CCMR2控制CH3和CH4。
其次是捕获/比较使能寄存器(TIMx_CCER),该寄存器控制着各个输入输出通道的开关。
最后是捕获/比较寄存器(TIMx_CCR1~4),该寄存器总共有4个,对应4个输通道CH1~4。
4个寄存器都差不多,说的简单一点,这个寄存器就是用来设置pwm的占空比。
4、具体看STM芯片手册。
TIMx_ARR寄存器的值怎么样来确定PWM的频率?TIM_Period(即是TIMx_ARR寄存器的值)的大小实际上表示的是需要经过TIM_Period次计数后才会发生一次更新或中断。
接下来需要设置时钟预分频数TIM_Prescaler,这里有个公式,我们举例来说明:例如系统频率是72MHz,TIM_Prescaler=71,那么PWM的时钟频率是72MHz/(71+1)=1MHz。
PWM输入捕获(只使用一路定时器通道)
PWM输入捕获(只使用一路定时器通道)PWM(Pulse Width Modulation)输入捕获是一种用于测量外部信号的技术,它基于定时器的工作原理。
在PWM输入捕获中,只使用一路定时器通道来实现信号测量。
下面将详细介绍PWM输入捕获的原理和实现方法。
一、PWM输入捕获原理PWM输入捕获的基本原理是通过测量定时器通道引脚上的高电平脉冲的宽度来计算外部信号的周期和占空比。
通常,定时器会以固定的频率进行计数,并将计数值存储在特定的寄存器中。
当检测到外部信号的上升沿时,定时器开始计数,当检测到下降沿时,定时器停止计数。
停止计数后,可以通过读取定时器寄存器的值获取外部信号的宽度。
通过测量多个周期的宽度,可以计算出信号的周期和占空比。
二、PWM输入捕获的实现方法以下是一种使用单通道定时器实现PWM输入捕获的步骤:1.配置定时器模式和通道首先,需要将定时器配置为输入捕获模式和单通道工作模式。
可以根据具体的硬件平台和需求选择适合的定时器和通道。
2.配置定时器时钟和频率根据需要,设置定时器的时钟源和频率。
定时器的频率应与外部信号的频率匹配或适当倍频。
这样可以确保定时器的计数能够准确地测量外部信号的周期和宽度。
3.配置输入捕获触发源选择合适的外部引脚作为输入捕获触发源,并将其连接到定时器的通道引脚。
通常,触发源可以是外部信号上的上升沿或下降沿。
4.配置中断和寄存器启用定时器的输入捕获中断,并设置适当的中断优先级。
还需要配置定时器寄存器以存储捕获到的计数值。
5.中断服务函数当定时器捕获到外部信号时,会触发定时器的输入捕获中断。
可以编写相应的中断服务函数来处理捕获事件。
在中断服务函数中,可以读取定时器寄存器的值,并进行相应的后续计算和处理。
6.数据处理和应用获取到外部信号的周期和占空比后,可以进行相应的数据处理和应用。
例如,可以将测量结果用于控制系统的反馈控制、信号发生器、信号分析等应用。
7.循环测量根据需要,可以设置定时器为重复测量模式,以定期测量外部信号的周期和占空比。
STM8S做输入捕获
STM8S做输入捕获STM8S做输入捕获希望我这个对正在用STM8S做输入捕获,测频的有帮助!-->问卷调查,答题有礼第一部:内部时钟 CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); //16M第二步:配置IO口我用的是STM8S103k3t6GPIO_Init(GPIOB , GPIO_PIN_0 , GPIO_MODE_IN_PU_NO_IT); //TIM1_CH1 PB0端口第三步:TIM1初始化,注意:tim1 分频是16000000/1600 =10000那计数一下的时间是!1/10000 S向上计数 0到20000 的时间是2Svoid TIME1_INIT(void){TIM1_DeInit();TIM1_TimeBaseInit(1600, TIM1_COUNTERMODE_UP, 20000, 0);TIM1_ICInit( TIM1_CHANNEL_1, TIM1_ICPOLARITY_RISING, TIM1_ICSELECTION_DIRECTTI , TIM1_ICPSC_DIV8, 0x0);TIM1_ITConfig( TIM1_IT_CC1 , ENABLE);TIM1_ClearFlag(TIM1_FLAG_CC1);TIM1_Cmd(ENABLE);}第四步: TIM4用来产生溢出中断用的!void TIME4_INIT(void){TIM4_TimeBaseInit(TIM4_PRESCALER_32 ,250);TIM4_ARRPreloadConfig(ENABLE);TIM4_PrescalerConfig(TIM4_PRESCALER_32,TIM4_PSCRELO ADMODE_IMMEDIATE);TIM4_SetAutoreload(250);TIM4_Cmd(ENABLE);TIM4_ITConfig(TIM4_IT_UPDATE,ENABLE);}第五步: TIM1的中断程序连续进入两次中断,两次计数的值乘第三步中计数一下的时间就是脉宽// if(TIM1_GetFlagStatus(TIM1_FLAG_CC1))if(TIM1_GetITStatus(TIM1_FLAG_CC1) != RESET){switch(temp){case 0: ICValue1=TIM1_GetCapture1();temp=1;break;case 1: ICValue2=TIM1_GetCapture1();temp=2;break;default:TIM1_CCxCmd(TIM1_CHANNEL_1, DISABLE);TIM1_ITConfig(TIM1_IT_CC1, DISABLE);temp=3;break;}TIM1_ClearITPendingBit(TIM1_IT_CC1);TIM1_ClearFlag(TIM1_FLAG_CC1);}第六步:TIM4的中断程序if(temp==3){temp=0;if(ICValue2>ICValue1){disvalue=ICValue2-ICValue1;}else if(ICValue2<ICValue1){//disvalue=0xffff+ICValue2-ICValue1;disvalue=20000+ICValue2-ICValue1; //防止计数到末端的时候重新计数}val[i0++] = disvalue;if(i0>10) i0=0;display();TIM1_CCxCmd(TIM1_CHANNEL_1, ENABLE);TIM1_ITConfig(TIM1_IT_CC1, ENABLE);}else{display();}TIM4_ClearITPendingBit(TIM4_IT_UPDATE);。
PWM输入捕获学习笔记
2016.4.17PWM 输入 ◆ STM32 输入捕获工作过程(通道1为例)一句话总结工作过程:通过检测TIMx_CHx 上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的捕获/比较寄存器(TIMx_CCRx)里面,完成一次捕获。
● 步骤1:设置输入捕获滤波器(TIMx 捕获/比较模式寄存器 1 (TIMx_CCMR1))位 7:4 IC1F :输入捕获 1 滤波器 (Input capture 1 filter)此位域可定义 TI1 输入的采样频率和适用于 TI1 的数字滤波器带宽。
数字滤波器由事件计数器组成,每 N 个事件才视为一个有效边沿:0000:无滤波器,按 fDTS 频率进行采样1000:fSAMPLING=fDTS/8, N=60001: fSAMPLING=fCK_INTN=21001: fSAMPLING=fDTS/8, N=80010: fSAMPLING=fCK_INTN=41010: fSAMPLING=fDTS/16, N=50011: fSAMPLING=fCK_INTN=81011: fSAMPLING=fDTS/16, N=60100: fSAMPLING=fDTS/2N=61100:fSAMPLING=fDTS/16,N=80101: fSAMPLING=fDTS/2N=8 1101: fSAMPLING=fDTS/32,N=50110: fSAMPLING=fDTS/4N=6 1110: fSAMPLING=fDTS/32, N=6 0111: fSAMPLING=fDTS/4N=8 1111: fSAMPLING=fDTS/32, N=8注意:在当前硅版本中,当ICxF[3:0]= 1、 2 或 3 时,将用CK_INT 代替公式中的f DTS。
●步骤2:设置输入捕获极性 (TIMx 捕获/比较使能寄存器(TIMx_CCER))CC1 通道配置为输出:0: OC1 高电平有效1: OC1 低电平有效CC1 通道配置为输入:该位选择是IC1还是IC1的反相信号作为触发或捕获信号00:非反相/上升沿触发10:保留,不使用此配置。
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教程实验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位。
●时钟/触发控制器产生了触发事件。
pwm输入捕获原理
pwm输入捕获原理PWM(Pulse Width Modulation)是一种通过改变信号的占空比来控制电压或电流的技术。
PWM输入捕获是指通过输入电路捕获并测量PWM信号的参数,如周期、占空比、频率等。
本文将详细阐述PWM输入捕获的工作原理。
首先,PWM信号是由高电平(高电压)和低电平(低电压)组成的周期性信号。
PWM输入捕获的原理就是利用外部硬件电路将这个周期性信号转换成时间间隔或频率。
常用的PWM输入捕获方法有两种:硬件计数器捕获和输入捕获/定时器(IC/Timer)捕获。
1.硬件计数器捕获硬件计数器捕获是指利用计数器来测量PWM信号的周期、占空比或频率。
计数器是一个递增计数的寄存器,在设定的时间基准下进行计数。
当捕获到一个PWM脉冲时,计数器的值就会被保存下来,然后根据这些值计算出具体的PWM参数。
具体步骤如下:1)初始化计数器,设置计数器的初始值为0。
2)设置计数器的时钟源和计数模式。
3)当捕获到一个PWM脉冲时,计数器停止计数,保存当前计数器的值。
4)根据计数器的值计算出PWM信号的参数,如周期、占空比或频率。
2. 输入捕获/定时器(IC/Timer)捕获输入捕获/定时器(IC/Timer)捕获是一种更高级的PWM输入捕获方法,它可以非常精确地测量PWM信号的参数。
这种方法利用了定时器和输入捕获模块来实现。
具体步骤如下:1)初始化定时器和输入捕获模块,设置定时器的时钟源和计数模式。
2)当捕获到一个PWM脉冲时,输入捕获模块记录下捕获脉冲的上升沿或下降沿的时间戳。
3)根据时间戳计算出PWM信号的参数,如周期、占空比或频率。
PWM输入捕获在实际应用中具有广泛的用途。
例如,它可用于测量电机的转速、计算电力质量参数、实现遥控器功能等。
由于能够精确地测量PWM信号的参数,因此PWM输入捕获常常被应用于需要高精度控制的系统中。
需要注意的是,在进行PWM输入捕获时,应根据实际需求选择合适的捕获模式、设置合适的输入电路和调整定时器的参数。
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(脉宽调制)是一种用于控制电子设备的技术,可以通过改变脉冲信号的宽度来控制电路的工作状态。
在嵌入式系统中,PWM技术被广泛应用于控制各种电机、灯光等设备,实现精确的控制和调节。
而输入捕获则是一种用于处理外部信号的技术,可以捕获外部信号的特定事件,并记录下对应的时间信息。
蓝桥杯pwm输入捕获问题就是要求参赛选手在给定的硬件平台上实现一个PWM输入捕获模块,能够准确捕获外部PWM信号的周期和脉宽,并输出相应的时间信息。
这个问题涉及到硬件设计、中断处理、定时器配置等多方面的知识,对参赛选手的综合能力提出了很高的要求。
为了解决蓝桥杯pwm输入捕获问题,首先需要对硬件平台进行深入了解。
通常情况下,硬件平台会提供一个PWM模块和一个定时器模块,参赛选手需要对这两个模块进行正确的配置和初始化。
具体来说,需要设置PWM模块的工作模式、频率和占空比,以及定时器模块的计时精度和中断触发条件等。
在硬件配置完成后,还需要编写相应的中断处理函数来处理输入捕获事件。
当外部PWM信号到达时,会触发定时器的中断并调用相应的中断处理函数,将捕获到的时间信息记录下来。
为了保证数据的准确性,还需要考虑中断嵌套、中断优先级和数据保护等问题,确保数据不会丢失或出现错误。
除了硬件配置和中断处理,还需要编写相应的算法来计算PWM信号的周期和脉宽。
通常情况下,可以通过测量两个上升沿之间的时间间隔来计算周期,通过测量一个上升沿和一个下降沿之间的时间间隔来计算脉宽。
在计算过程中,还需要考虑定时器的精度和溢出情况,避免计时器溢出导致数据错误。
STM8输入捕获(网上)
[原]STM8输入捕获2014-9-4阅读324评论0最近在用STM8的过程中需要用到一个频率检测的功能,还好STM8S207的定时器中自带有输入捕获功能,之前还想着用定时器计数方式来实现的,但既然人家提供了该功能,那就试试吧,由于硬件里面接的是PC1引脚就只看了Timer1,其他的定时器应该也是类似的,看了资料之后发现STM8的输入捕获其实与STC12C5A60S2中的PCA捕获模式很类似,但是看资料没有后者清晰易懂。
在捕获模式中,基本上只用到了读进程,在STM8中有一个影子寄存器,但对于我们来说是看不到的,我们仅操作预装载寄存器即可。
而且需要注意的是无论是计数器还是捕获/比较寄存器都是先读/写高8位,后读/写低8位数据。
在文档中给出了一个输入捕获模式的流程按着这个流程来就可以完成我们的输入捕获文档中首先提到将TIM1_CCMR1寄存器的CC1S位写01,将端口配置为输入,但在TIM1_CCMR1的寄存器中有说明CC1S位的更改需在通道关闭时(TIM1_CCER1寄存器的CC1E=0)才可写入,TIM1_CCMR1寄存器有两种功能,分别对应捕获模式和比较模式,只需要捕获模式即可滤波器是用来避免频率波动的直接写0即可,无滤波器,分频器我们也写00不用分频器,当然也可以使用分频器,提高准确率。
接着是设置触发方式,我们选择上升沿触发最后使能捕获功能,设置TIM1_CCER1寄存器的CC1E位=1,由于我们采用中断方式因此也将TIM1_IER寄存器的CC1IE位置1,允许中断请求。
完整的初始化代码如下当发生一个输入捕获时,计数器的值被传送到TIM1_CCR1寄存器中,计时器的时钟源在程序中我们设置为16分频分频过后计数器的频率为1MHz,这里采用分频主要是避免计数器溢出,这样同时也降低了精度,同时设置计数器的初值为0,计数器默认计数方式是向上计数,计到最大值后又从0开始计数,这里只从串口输出了周期,结果如下可以看到周期在一个范围内波动我们取一个值0x79ED来计算,它所对应的频率f=1000000/0x79ED=32.0379Hz还是比较接近我们的实际输入频率30Hz,误差是大了些,可以通过代码继续改进。
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);}}}。
【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输入捕获频率学习笔记陈宏敏2013-5-251、PWM:脉冲宽度调制,英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。
简单一点,就是对脉冲宽度的控制。
2、STM32的定时器除了TIM6和TIM7。
其他的定时器都可以用来产生PWM输出。
其中高级定时器TIM1和TIM8可以同时产生多达7路的PWM输出。
而通用定时器也能同时产生多达4路的PWM输出,这样STM32最多可以同时产生30路PWM输出!等下我用TIM2的CH2产生一路PWM输出和PWM输入。
3、要使STM32的通用定时器TIMx产生PWM输出,我们会用到3个寄存器,来控制PWM。
这三个寄存器分别是:捕获/比较模式寄存器(TIMx_CCMR1/2)、捕获/比较使能寄存器(TIMx_CCER)、捕获/比较寄存器(TIMx_CCR1~4)。
(注意,还有个TIMx的ARR寄存器是用来控制pwm的输出频率)。
首先是捕获/比较模式寄存器(TIMx_CCMR1/2),该寄存器总共有2个,TIMx _CCMR1和TIMx _CCMR2。
TIMx_CCMR1控制CH1和2,而TIMx_CCMR2控制CH3和CH4。
其次是捕获/比较使能寄存器(TIMx_CCER),该寄存器控制着各个输入输出通道的开关。
最后是捕获/比较寄存器(TIMx_CCR1~4),该寄存器总共有4个,对应4个输通道CH1~4。
4个寄存器都差不多,说的简单一点,这个寄存器就是用来设置pwm的占空比。
4、具体看STM芯片手册。
TIMx_ARR寄存器的值怎么样来确定PWM的频率?TIM_Period(即是TIMx_ARR寄存器的值)的大小实际上表示的是需要经过TIM_Period次计数后才会发生一次更新或中断。
接下来需要设置时钟预分频数TIM_Prescaler,这里有个公式,我们举例来说明:例如系统频率是72MHz,TIM_Prescaler=71,那么PWM的时钟频率是72MHz/(71+1)=1MHz。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
CC1IF未曾被清除时,CC1OF也被置1。 如设置了CC1IE位,则会产生一个中断。 为了处理捕获溢出(CC1OF位),建议在读出重复捕获标志之前读
取数据,这是为了避免丢失在读出捕获溢出标志之后和读取数据之前 可能产生的重复捕获信息。
IC1PS=00) 选择有效输入端:例如TIM1_CCMR1连接到TI1输入,所以写入 TIM1_CCMR1寄存器中的CC1S=01,此时通道被配置为输入,并 且TIM1_CCR1寄存器变为只读。 设置TIM1_CCER1寄存器的CC1E=1,允许捕获计数器的值到捕 获寄存器中。 如果需要,通过设置TIM1_IER寄存器中的CC1IE位允许相关中断 请求。 以上便完成了 基本通道 如果有有效电平来 就产生事件或者中断。 配置很简单 诸如以下的例程:选择有效输入端 配置CCMR1的 CC1S位
TIM1->CCER1 |= 0x11;//使能输入捕获1,2 TIM1_Cmd(ENABLE);
}
中断里的程序 if(TIM1_GetITStatus(TIM1_IT_CC1)) { TIM1_ClearITPendingBit(TIM1_IT_CC1); IC1Value=TIM1_GetCapture1(); i++; if(i==0xff) i=0; } if(TIM1_GetITStatus(TIM1_IT_CC2)) { TIM1_ClearITPendingBit(TIM1_IT_CC2); IC2Value=TIM1_GetCapture2(); i++; if(i==0xff) i=0;
怎样检测输入信息: 以 下 例 子 说 明 如 何 在 TI1 输 入 的 上 升 沿 时 捕 获 计 数 器 的 值 到 TIM1_CCR1寄存器中,步骤如下:
K看图2 从左到右 依次配置完成检测通道: 根据输入信号TIi的特点,可通过配置TIM1_CCMRi寄存器中的 ICiF位来设置相应的输入滤波器的滤波时间。假设输入信号在最多 5个时钟周期的时间内抖动,我们须配置滤波器的带宽长于5个时 钟周期;因此我们可以连续采样8次,以确认在TI1上一次真实的 边沿变换,即在TIMi_CCMR1寄存器中写入IC1F=0011,此时, 只有连续采样到8个相同的TI1信号,信号才为有效(采样频率为 fMASTER)。 选 择 TI1 通 道 的 有 效 转 换 边 沿 , 在 TIM1_CCER1 寄 存 器 中 写 入 CC1P=0(上升沿)。 配置输入预分频器。在本例中,我们希望捕获发生在每一个有效 的电平转换时刻,因此预分频器被禁止(写TIM1_CCMR1寄存器的
void tim1_config(void) {
TIM1_DeInit(); TIM1->CCER1 &= 0xee;//禁止输入捕获1,2 TIM1->CCMR1 |=0x01;// ch1到ti1fp1 TIM1->CCER1&= 0xec;//ch1 上升沿触发 TIM1->CCMR2 |=0x02;// ch2选择 ti1fp2上 TIM1->CCER1|= 0x20;//ch1 下降沿触发 ic2 TIM1->SMCR |=0X54;//选源触发源和触发方式 复位 TIM1->IER |=0x06;//使能中断ch1 ch2
CC1S[1:0]:捕获/比较1 选择。 这2位定义通道的方向(输入/输出),及输入脚的选择: 00:CC1通道被配置为输出; 01:CC1通道被配置为输入,IC1映射在TI1FP1上; 10:CC1通道被配置为输入,IC1映射在TI2FP1上; 11:CC1通道被配置为输入,IC1映射在TRC上。此模式仅工作在内部 触发器输入被选中时(由TIM1_SMCR寄存器的TS位选择)。
注:CC1S仅在通道关闭时(TIM1_CCER1寄存器的CC1E=0)才是可写的。 就是说使能tim1的时候 不能配置相关寄存器
根据图2 可知选择 TI1FP1 01值 TIM1->CCMR1 |= 0x01;即可
当发生一个输入捕获时: 当产生有效ห้องสมุดไป่ตู้电平转换时,计数器的值被传送到TIM1_CCR1寄存
降沿有效)。 5. 选择有效的触发输入信号:置TIM1_SMCR寄存器中的TS=101(选
择TI1FP1)。 6. 配置触发模式控制器为复位触发模式:置TIM1_SMCR中的
SMS=100。
5 6的触发输入 配置 是前面时间的产生去选择某一个做为触发事 件 去控制比如技术控制器和技术存储器等动作 7. 使能捕获:置TIM1_CCER1寄存器中CC1E=1,CC2E=1。 配置如下:
PWM 输入捕获是普通捕获的一种特殊情况: 它使用两个通道计算波形的周期和占空比:
看上图 我们使用 CH1 和 CH2 一起,不过我们配置信号只是 从 CH1 口输入,然后通过 TI1FP2 到 IC2 然后进入边沿检测,按照 手册的配置过程:
你可以用以下方式测量TI1上输入的PWM信号的周期(TIM1_CCR1 寄存器)和占空比(TIM1_CCR2寄存器)。(具体取决于fMASTER的频 率和预分频器的值) 1. 选择TIM1_CCR1的有效输入:置TIM1_CCMR1寄存器的
CC1S=01(选中TI1)。 2. 选择TI1FP1的有效极性(用来捕获数据到TIM1_CCR1中和清除计
数器):置CC1P=0(上升沿有效)。 3. 选择TIM1_CCR2的有效输入:置TIM1_CCMR2寄存器的
CC2S=10(选中TI1FP2)。 4. 选择TI1FP2的有效极性(捕获数据到TIM1_CCR2):置CC2P=1(下
Stm8 tim1 pwm 输入捕获学习笔记 -------------计算周期和占空比 作者 萧星
1图
2图 现已图2为例 理解一下普通的输入捕获的例子:
输入捕获 无非就是检验相同的一个或者几个边沿,根据差值 再按
照一定得运算求出输入波形的周期信息,这里每个通道每次只能配置 为不是上升沿就是下降沿。为什么不能配置为上升沿和下降沿都可 以?像外部中断一样。细想一想 我们便知道 那样做是没有意义的 因为我们不知道是上升沿还是下降沿的到来,所以对计算输入波形的 信息 并不能明确算出。而外部中断作为一个事件的产生,对怎样产 生 并不需要知道。
} 读取波形信息的函数:
u16 GET_period(void) { return(IC1Value/2);//在默认内部8分频时钟2mhz 单位us }
u16 GET_highperiod(void) { return(IC2Value/2);//在默认内部8分频时钟2mhz 单位us }
u16 GET_lowperiod(void) { return((IC1Value-IC2Value)/2);//在默认内部8分频时钟2mhz 单位 us } 以上程序在微芯力科3合一板子上 已试验通过