版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
捕获PWM信号的高电平持续时间1STM32程序设计案例教程电子工业出版社欧启标任务目标应用TIM5的通道1测量TIM14输出的方波信号的每个周期高电平持续时间。1.配置TIM14使用通道1输出周期为10KHz的方波信号。因为TIM14挂接在APB1输出端的倍频器上,其内部时钟是84MHz,所以我们可以将其时基单元的配置为PSC=8399,ARR=1999,CCR1=1000,这样计数器的计数信号频率为10KHz,计数的周期为200ms,每周期中高电平为100ms。2.配置TIM5的通道1为输入捕获功能。TIM5的时基单元的设置为PSC=83,ARR=9999,因为TIM5也挂接在APB1输出端的倍频器上,由此可得TIM5的计数器的输入信号频率为1Mhz,输入信号周期为1us,每10000us即10ms溢出一次,这样设置的目的是为了方便观察溢出设计。实际应用中为了扩大应用范围,ARR一般都设置为0XFFFFFFFF(注意,TIM5是32位,TIM14是16位)。【实现思路】3.将TIM14的通道1的输出端PF9和TIM5的通道1的输入端PA0用杜邦线连接起来,这样从TIM14输出的信号刚好从TIM5进入,这两个引脚位置如图9-36所示。4.配置USART1输入输出使能。方便将计算好的高电平信号宽度等信息发送到串口助手上观看结果。5.测量过程分析。一开始将定时器TIM5的捕获设置为上升沿触发,当捕获到上升沿时将触发改为下降沿触发,且为了减少计算,此时对计数器进行清0。接下来当捕获到下降沿时视具体情况关闭定时器或者重新设置为高电平触发捕获,重复前面过程以进行多次测量。假设捕获到下降沿时,CCR1的值为count_ent,溢出次数为N,则高电平宽度为Width=((ARR+1)*N+count_ent))*计数器的周期(9-4)6.程序实现分析。①主函数用查询实现串口数据发送。当完成一次高电平捕获时,由捕获到的数据及溢出次数计算出脉冲信号一周期中高电平持续时间。由于高电平持续时间只有主函数用到,故设置为局部变量,而标记一次捕获过程的完成需要的标志变量在下面的函数中需要用到,所以定义为全局变量。②溢出中断回调函数用于溢出次数的处理。当定时器TIM5的通道1捕获到上升沿时,该函数开始对溢出次数进行计数。这里涉及到一个标记TIM5触发到上升沿的标志变量,由于下面函数中用到,故需要设置为全局变量。③捕获中断回调函数用于捕获数据的获取及设置。当TIM5的通道1捕获到上升沿时,对计数器清0,同时将下次触发改为下降沿触发。在接下来的下降沿到来时,将CCR1捕获到的计数器的值保存并标记一次完整的捕获过程结束。在该函数中,当上升沿到来时,标记TIM5触发到上升沿的标志变量被置1,以便溢出中断中开始对溢出次数进行计数。当下降沿到来时将标记完成一次捕获的标志变量置1,以供主函数查询计算然后发送串口助手显示。7.整个程序的结构设计①主函数main()intmain(void){
系统初始化;
while(1)
{
if(测量完)
{
计算高电平宽度=计数器输入信号的周期*((ARR+1)*溢出次数+temp2-temp1);
显示高电平宽度;
初始化相关标志和溢出次数;
}
}}②溢出中断回调函数的设计voidHAL_TIM_PeriodCallback(TIM_HandleTypeDef*htim){
if(没有测量完)
{
if(上升沿已经到来)
{
if(溢出累加器溢出了)
{
打印信息说明电平过长;
初始化相关标志和变量;
}
else
溢出累加器+1;
}
}}③捕获回调函数的设计voidHAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef*htim){
if(没有测量完)
{
if(下降沿到来)
{
标志捕获已经完成;
读取CCR的值(temp2=TIMx_CCR1或者HAL_TIM_ReadCapturedValue(&htim5,
TIM_CHANNEL_1));
}
else//是上升沿到来
{
标志上升沿到来;
读取CCR的值;
将捕获触发方式改为下降沿触发;
}
}}【实现过程】1.选择目标芯片2.外设设置①时钟模块的设置;②PWM输出的设置(TIM14)。这里需要设置时基单元和比较单元,如图9-37所示。③输入捕获模块的设置(TIM5)。这里需要设置通道1的输入捕获功能使能、时基单元、输入捕获单元并使能TIM5的全局中断,具体分别如图9-38和9-39所示。④串口模块的设置。这里我们使用的是USART1实现与PC端的通信。USART1的设置过程如图9-40所示:3.工程配置工程管理中我们将工程名配置为TIM5_CaptureTim14Pwm。4.应用程序的编写。在main.c文件中添加串口重定向、数据处理及发送等代码,具体又分为3步:①添加串口重定向函数fputc及其对应的头文件;②添加两个全局变量,具体如下uint8_tTIM5CH1_CAPTURE_STA=0;//输入捕获状态 uint32_t TIM5CH1_CAPTURE_VAL=0; //输入捕获值变量TIM5CH1_CAPTURE_VAL用于保存高电平结束时(捕获到下降沿)计数器的值,变量TIM5CH1_CAPTURE_STA的低6位用于保存计数次数,最高位bit7用于标志一次输入捕获是否完成,置1说明完成,次高位bit6用于标志一次捕获时的上升沿的到来,以便开启溢出中断的计数。③将主函数改写如下:intmain(void){
//系统初始化 while(1) { if(TIM5CH1_CAPTURE_STA&0X80)//bit7=1说明成功捕获到了一次高电平 { OverFlowCount=TIM5CH1_CAPTURE_STA&0X3F; HighLevelTime=OverFlowCount; printf("OverFlowCount=%d\r\n",OverFlowCount);/*溢出时间总和*/ HighLevelTime=(HighLevelTime*htim5.Init.Period)+OverFlowCount; HighLevelTime+=TIM5CH1_CAPTURE_VAL;//得到总的高电平时间 printf("HIGH:%lldus\r\n",HighLevelTime);//打印总的高点平时间 TIM5CH1_CAPTURE_STA=0;//一次捕获完成,重置0 }} HAL_Delay(20);//延时不要太长}
在主函数中,我们将计数次数分两步计算,首先是计算溢出次数导致的计数几次,然后再加上下降沿到来时捕获的值。而在计算溢出次数导致的计数次数时,我们采用N*ARR+N的方式来计算,而不是采用N*(ARR+1),这是因为实际中我们设置ARR的值为0xFFFFFFFF,如果采用ARR+1的方式则会导致溢出。④添加两个回调函数,一个是溢出中断时执行的回调函数,一个是发生捕获中断时执行的回调函数,具体如下:voidHAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef*htim)//溢出中断{if((TIM5CH1_CAPTURE_STA&0x80)==0)//结果为0说明一次捕获没有完成{if(TIM5CH1_CAPTURE_STA&0x40)//bit6=1说明捕获到上升沿{if((TIM5CH1_CAPTURE_STA&0x3F)==0x3F)//判断计数位满没有{TIM5CH1_CAPTURE_STA|=0x80;//满,说明高电平太长,可能出错了TIM5CH1_CAPTURE_VAL=0xFFFFFFFF;}elseTIM5CH1_CAPTURE_STA++;//如果低6位还没有满,溢出一次加一次}}}voidHAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef*htim)//捕获中断{if((TIM5CH1_CAPTURE_STA&0x80)==0)//bit7为0说明一次捕获没有完成{/*bit6=1说明刚才已经捕获到上升沿,本次中断由下降沿触发导致*/if(TIM5CH1_CAPTURE_STA&0x40){TIM5CH1_CAPTURE_STA|=0x80;//下降沿到说明一次捕获结束TIM5CH1_CAPTURE_VAL=HAL_TIM_ReadCapturedValue(&htim5,TIM_CHANNEL_1);TIM_RESET_CAPTUREPOLARITY(&htim5,TIM_CHANNEL_1);TIM_SET_CAPTUREPOLARITY(&htim5,TIM_CHANNEL_1,TIM_INPUTCHANNELPOLARITY_RISING);}else//bit6不等于1,说明本次中断由上升沿触发{__HAL_TIM_DISABLE(&htim5);TIM5CH1_CAPTURE_STA=0;TIM5CH1_CAPTURE_STA|=0x40;//bit6置1说明上升沿捕获到了TIM5CH1_CAPTURE_VAL=0;__HAL_TIM_SetCounter(&htim5,0);TIM_RESET_CAPTUREPOLARITY(&htim5,TIM_CHANNEL_1);TIM_SET_CAPTUREPOLARITY(&htim5,TIM_CHANNEL_1,TIM_INPUTCHANNELPOLARITY_FALLING);__HAL_TIM_ENABLE(&htim5);}}}5.确保开发板硬件连接好。主要有①串口USART1的发送引脚PA9、接收引脚PA10以分别与USB接口的接收引
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- Unit 1 Time to Relax (Period 2)Section A (3a-3d)同步练2025-2026学年人教版英语八年级下册
- 2026重案组的面试题及答案
- 2026年一建水利工程二轮精练试卷及答案
- 2026年一建民航实务考前押题冲刺试卷及答案
- 2026年一建矿业实务考前提分特训试卷及答案
- 2026年一建矿业工程错题专项试卷及答案
- 2026调查活动面试题及答案
- 2026感想类面试题目及答案
- 2026公安特招面试题及答案
- 2026会计群面试题目及答案
- 乡镇卫生院叶酸制度
- 工会职工驿站日常管理制度(3篇)
- 医院质控办年度工作计划
- 重卡维修站规范制度
- 中药熏洗器具的选择与使用
- 电力行业无人机培训课件
- 科研项目立项及验收流程详解
- 风险管理面试题及内控问题集含答案
- 导视系统规划设计方案
- 妊娠期糖尿病非药物管理临床实践指南(2024版)
- 人行道工程透水砖铺装施工方案与技术措施
评论
0/150
提交评论