单片机产品设计与调试-基于STM32F1xx机型和HAL库函数 教案 项目6、利用计数器实现工件计数显示和打包控制_第1页
单片机产品设计与调试-基于STM32F1xx机型和HAL库函数 教案 项目6、利用计数器实现工件计数显示和打包控制_第2页
单片机产品设计与调试-基于STM32F1xx机型和HAL库函数 教案 项目6、利用计数器实现工件计数显示和打包控制_第3页
单片机产品设计与调试-基于STM32F1xx机型和HAL库函数 教案 项目6、利用计数器实现工件计数显示和打包控制_第4页
单片机产品设计与调试-基于STM32F1xx机型和HAL库函数 教案 项目6、利用计数器实现工件计数显示和打包控制_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PAGE19项目6、利用计数器实现工件计数显示和打包控制项目总目标看懂STM32内部定时器的计数路径;掌握利用外部时钟模式1、外部时钟模式2以及更新中断实现脉冲计数的软硬件设计方法。具体工作任务利用STM32单片机的外部时钟模式1外部时钟模式2,实现生产线工件计数显示与控制任务。图6.0.1生产线工件计数显示器示意图

任务6.1利用外部时钟模式1实现生产线工件计数显示一、任务目标任务目标:初步掌握用外部时钟模式1和TIMx_CH引脚,实现脉冲计数的方法。具体工作任务:利用STM32单片机的外部时钟模式1和TIMx_CH引脚,进行生产线工件检测,要求每过一个工件,计数值加1并显示,满100个自动清0,并重新开始计数。二、学习与实践讨论与发言请结合项目4和项目5,谈一谈本任务的设计思路。请阅读以下资料并按照指示的工作顺序完成任务。(二)通用定时器的结构再认识1、外部时钟模式1路径图6.1.1通用定时器的TIMx_CH1和TIMx_CH2的外部时钟模式1路径在项目5中,我们已经使用过内部时钟模式(InternalClockMode)实现定时控制和PWM输出。本任务中我们将使用外部时钟模式1(ExternalTriggerClockMode1)实现对传感器输入的脉冲进行计数。从图6.1.1可以看出,内部时钟模式下,控制器的输入脉冲来自CK_INT,也就是TIMxCLK;外部时钟模式1情况下,控制器的脉冲则来自TRGI(TriggerInput,触发输入)。在项目5中,我们曾使用TIMxCH1~TIMx_CH4引脚做PWM输出。这四个引脚被表达在图6.1.1的右侧,作为OC1~OC4的输出引脚。但你一定很早就注意到在图的左侧,也有四个同名的引脚TIMxCH1~TIMx_CH4。将引脚画在左侧,代表做输入,做TI1~TI4的输入引脚(TriggerInput)。本任务中我们只研究TI1和TI2。要实现工件计数任务,可将光电传感器输入的脉冲接在TIMx_CH1或TIMx_CH2引脚上。通过编程,可以使输入脉冲信号按照如下三条路径进入CNT计数器:路径1:TIMx_CH1→TI1→TI1FP1→TRGI→CK_PSC→CK_CNT路径2:TIMx_CH1→TI1→TI1F_ED→TRC→TRGI→CK_PSC→CK_CNT路径3:TIMx_CH2→TI2→TI2FP2→TRGI→CK_PSC→CK_CNT当然,从图6.1.1可以看出,外部时钟模式1即TRGI的来源不止这三条,本任务中我们只研究这三条。在这三种情况下,计数脉冲来自外部引脚,CNT计数器对外部脉冲(而不是内部脉冲CK_CNT)进行计数。通过读取计数值,就可以知道来了多少个脉冲;通过计数值与ARR值的比较结果,就可以知道输入脉冲是否达到了预定的数量,这就是TIM进行外部脉冲计数的原理。2、计数过程如图6.1.1,来自TIMx_CH1和TIMx_CH2引脚的外部脉冲经过了多路开关、输入滤波/边沿检测、控制器、PSC预分频器被送入CNT计数器。计数过程中还使用到ARR寄存器。关于控制器、PSC预分频器、ARR等设备的作用在项目5中我们已经学习过,这里只看多路开关、输入滤波和边沿检测电路。多路开关多路开关常常具有多个输入和1个输出。输出来自哪个输入取决于编程设置。例如可以通过编程设置TI1来自TIMx_CH1还是来自异或门。也可以设置TRC信号来自ITR或TI1F_ED。(2)输入滤波功能:输入滤波器用于滤掉叠加在输入信号中的干扰。过滤掉干扰信号后的理想波形如图6.1.2所示。图6.1.2过滤掉干扰后的理想波形设定值:滤波系数可编程设定,允许范围是0~15。滤波系数=0,不滤波;滤波系数=15,滤波能力最强。滤波系数不同,滤掉干扰信号的频率范围不同。本项目暂不考虑滤波系数的选择方法,将滤波系数设为0。(3)边沿检测功能:边沿检测用于决定是对输入信号的上升沿还是下降沿进行检测,可编程设定。例如希望输入信号每来一个上升沿进行计数,就应将其设置为上升沿触发。图6.1.3设置为上升沿触发、加计数、PSC不分频、ARR=3图6.1.4设置为下降沿触发、加计数、PSC不分频、ARR=3如图6.1.3所示,如果指定对输入信号的上升沿进行检测,并且PSC不分频、加计数模式、ARR=3,则输入引脚上每来1个上升沿,经定时器时钟CK_INT同步后,CK_CNT输出1个脉冲,计数值加1;计数值加到4自动重装为0;重装时,发出更新中断请求。如图6.1.4所示,如果指定对输入信号的下降沿进行检测,其它不变,则输入引脚上每来1个下降沿,计数值加1;计数值加到4自动重装为0,同时发出更新中断请求。CNT也可以做减计数或加/减计数,计数值的变化规律同任务5.1中所述,这里不再细述。3、可使用的引脚做输入时,TIMx_CH1~TIMx_CH4允许使用的引脚与做输出时完全相同,详细情况请参见项目5表5.6.2。本任务中我们只研究TIMx_CH1和TIMx_CH2。(三)系统方案及电路设计图6.1.5系统方案、传感器电路、数码管电路本系统方案和电路设计与项目4类似,需要光电传感器进行工件检测、需要数码管进行工件数显示。但光电传感器电路能使用的引脚受到定时器限制,只能从表5.6.2中选择。本任务只学习TIMxCH1和TIMxCH2输入,可选TIM5_CH1通道,它默认复用PA0引脚,刚好与开发板上K_UP按键相同。系统方案、传感器电路、数码管电路如图6.1.5。(四)程序设计与调试1、程序流程设计图6.1.6(a)是项目4我们使用外部中断实现工件计数的流程。每当EXTI引脚有脉冲输入时,程序自动进入中断服务程序。在中断服务程序中通过计数值+1语句实现计数。图6.1.6(b)是利用定时器的计数功能实现工件计数的流程。初始化定时器后,定时器开始自动检测PA0引脚是否有脉冲输入,如果有自动进行加1计数,因此无需软件加1,主程序只需不断读取计数器的计数值并将其送数码管显示即可,中断程序也不再需要。图6.1.6程序流程2、搭建框架(1)复制文件夹:05-08-电机调速-通用定时器PWM输出-PC7和PC6,修改副本文件名为:06-01-工件计数-通用计数器-外部时钟模式1-路径1。(2)打开文件夹,修改工程文件名为Workpiece_count。(3)双击Workpiece_count,打开keil5,按照图6.1.7设置project和包含路径。图6.1.7程序框架3、主程序设计与调试第13行定时器初始化函数中,将PSC设定值设为1-1,不分频,这样每来1个脉冲,计数值加1。因为希望计数值满100个自动清0,第13行将ARR设定值设为100-1。第16行用了一个库宏函数,读取计数值。第18行将得到的计数值送数码管显示。有关计数值读取库宏__HAL_TIM_GET_COUNTER(&定时器操作变量)的说明参见项目5表5.5.1。定时器程序设计与调试应将程序中所有的定时器都替换为TIM5。第11~16行用于定时器基本初始化,并调用第25行的对应Base_MspInit函数。第18行用于启动定时器。注意这里并不需要启动定时器中断,因此库函数名中少了“IT”。第34~39行用于初始化PA0引脚。注意第35行,应将其设置为复用输入。第36行和37行则根据需要选择其中之一。第29~32行用于开启GPIO时钟、定时器时钟、复用时钟并指出重映射的方式。关于重映射方式,请参见项目5表5.6.8~5.6.11。第27行定义了一个时钟源设置变量,其类型为TIM_ClockConfigTypeDef。第41~44行是给时钟源设置变量赋值,以便指出脉冲从哪里来,触发方式、分频系数、滤波系数。第45行使用了时钟源设置库函数,进行时钟源初始化。关于时钟源设置库函数表6.1.1给出了具体解释。表6.1.1定时器时钟源设置库函数库函数名:HAL_TIM_ConfigClockSource(&TIM操作变量,&TIM时钟源)原型:HAL_StatusTypeDefHAL_TIM_ConfigClockSource(TIM_HandleTypeDef*htim,TIM_ClockConfigTypeDef*sClockSourceConfig)功能:按照TIM时钟源的值,设置TIM操作变量指定的定时器,并返回操作结果。其中:TIM操作变量类型为TIM_HandleTypeDef,返回值的类型为HAL_StatusTypeDef,这二者的定义参见表5.2.1和5.2.2。TIM时钟源的数据类型为TIM_ClockConfigTypeDef,具体定义如下:typedefstruct{uint32_tClockSource;/*TIM时钟源,具体取值见后*/uint32_tClockPolarity;/*时钟极性,具体取值见后*/uint32_tClockPrescaler;/*时钟分频系数,具体取值见后*/uint32_tClockFilter;/*滤波系数,取值为:0~15*/}TIM_ClockConfigTypeDef;ClockSource(TIM时钟源)取值:TIM_CLOCKSOURCE_ETRMODE2:外部时钟模式2,来自TIMx_ETRTIM_CLOCKSOURCE_INTERNAL:内部时钟模式,来自CK_INTTIM_CLOCKSOURCE_ITR0:外部时钟模式1,来自ITR0TIM_CLOCKSOURCE_ITR1:外部时钟模式1,来自ITR1TIM_CLOCKSOURCE_ITR2:外部时钟模式1,来自ITR2TIM_CLOCKSOURCE_ITR3:外部时钟模式1,来自ITR3TIM_CLOCKSOURCE_TI1ED:外部时钟模式1,来自TI1F_EDTIM_CLOCKSOURCE_TI1:外部时钟模式1,来自TI1FP1TIM_CLOCKSOURCE_TI2:外部时钟模式1,来自TI2FP2TIM_CLOCKSOURCE_ETRMODE1外部时钟模式1,来自ETRFClockPolarity(时钟极性)取值:TIM_CLOCKPOLARITY_INVERTED(取反,ETR时钟源用)TIM_CLOCKPOLARITY_NONINVERTED(不取反,ETRx时钟源用)TIM_CLOCKPOLARITY_RISING(上升沿,TIx时钟源用)TIM_CLOCKPOLARITY_FALLING(下降沿,TIx时钟源用)TIM_CLOCKPOLARITY_BOTHEDGE(上升和下降沿,TIx时钟源用)ClockPrescaler(时钟分频系数)取值:TIM_CLOCKPRESCALER_DIV1(2)TIM_CLOCKPRESCALER_DIV2(3)TIM_CLOCKPRESCALER_DIV4(4)TIM_CLOCKPRESCALER_DIV8外部时钟模式1的信号源将图6.1.1简化为图6.1.8,可看到,外部时钟模式1的信号源TRGI有8个,从上到下分别是:(1)ETRF;(2)ITR0;(3)ITR1;(4)ITR2;(5)ITR3;(6)TI1F_ED;(7)TI1FP1;(8)TI2FP2。图6.1.8外部时钟模式1的8个信号源如果将TIM时钟源设置为:TIM_CLOCKSOURCE_TI1,则定时器的计数脉冲来自TI1FP1。很容易看出,TI1FP1来自TI1。由于上电复位后异或门被关闭,TI1信号将来自TIMxCH1引脚输入。这就是之前我们所说的路径1。如果将TIM时钟源设置为:TIM_CLOCKSOURCE_TI1ED(ED=Edge即边沿),则定时器的计数脉冲来自TI1F_ED。从图中可以看出,TI1F_ED同样来自TI1。在异或门被关闭情况下,TI1_ED信号也来自引脚TIMx_CH1,这就是之前我们所说的路径2。路径2与路径1的区别是,路径2是沿检测,无论上升沿或下降都触发计数。路径1则可编程设定触发沿。如果将TIM时钟源设置为:TIM_CLOCKSOURCE_TI2,则定时器的计数脉冲来自TI2FP2。这就是之前我们所说的路径3。此时脉冲信号来自TIMxCH2引脚。数码管程序设计与调试与之前相比没有变化。6、软硬件联调(1)连接电路,连接开发板到计算机;(2)按照图6.1.9,在“Options”中找到开发板的IDCODE并进行设置;(3)编译、生成、下载程序到开发板;(4)反复按下K_UP按键,模拟工件到来与离去,观察程序运行效果,如果不正确,修改程序或电路直到运行结果正确。(5)修改时钟分割系数ClockDivision为DIV4,滤波系数ClockFilter为15,观察效果。(6)将外部时钟模式1的信号源指定为TI1F_ED,下载后观察有何不同。(7)利用TIM5_CH2引脚接收传感器输入脉冲,修改程序,下载后调试。图6.1.9目标板设置故障现象:解决办法:原因分析:

三、要点记录及成果检验任务6.1利用TIMx_CH引脚实现工件计数显示姓名学号日期分数(一)术语记录英文中文ExternalTriggerClockModeInternalClockModeTriggerInputConfigClockSourcePolarityFilterEdge(二)自主设计用TIM3_CH2引脚和外部时钟模式1,完成如下功能:每按下按键1次,计数加1并显示,加到100自动清0。请画出电路图,写出程序并调试。

任务6.2利用外部时钟模式2实现生产线工件计数显示一、任务目标任务目标:掌握用外部时钟模式2或外部时钟模式1对TIMx_ETR引脚输入脉冲进行计数的方法。具体工作任务:利用STM32单片机的TIMx_ETR引脚,进行生产线工件检测,要求每过一个工件,计数值加1并显示,满100个自动清0,并重新开始计数。二、学习与实践(一)讨论与发言请结合任务1,谈一谈本任务的设计思路。请阅读以下资料并按照指示的工作顺序完成任务。(二)通用定时器的结构再认识1、外部时钟模式2路径图6.2.1通用定时器的TIMx_ETR的外部时钟模式路径STM32通用定时器也支持从TIMx_ETR引脚输入外部脉冲,通过编程,可使信号通过两条路径进入CNT计数器:路径1:TIMx_ETR→ETR→ETRP→ETRF→TRGI→CK_PSC→CK_CNT(外部时钟模式1)路径2:TIMx_ETR→ETR→ETRP→ETRF→→→→CK_PSC→CK_CNT(外部时钟模式2)无论哪一种,CNT计数器都是对来自TIMx_ETR引脚的外部脉冲进行计数。通过读取计数值,就可以知道来了多少个脉冲;通过计数值与ARR值的比较结果,就可以知道输入脉冲是否达到了预定的数量。2、计数过程如图6.2.1,来自TIMx_ETR引脚的外部脉冲经过了极性选择/边沿检测/预分频器、输入滤波器、控制器、PSC预分频器到达CNT进行计数,并与ARR寄存器内容相比较。与来自TIMx_CH1和TIMx_CH2引脚的外部时钟模式1路径相比,多了一个预分频器,这个预分频器也称为ETR预分频器。它的作用和PSC预分频器一样也是对输入脉冲做分频处理的。ETR预分频系数设定值:1、2、4、8。表6.1.1中的ClockPrescaler(时钟分频系数)就是设定此参数的,这个参数也叫做ETR预分频系数。加计数模式下,如果ETR预分频系数=2,PSC预分频系数=3-1,则总分频系数=2×3=6,即ETR引脚每来6个脉冲,CNT计数1次。从直观的角度,肯定是设置ETR预分频系数=1比较好,这样ETR引脚每来一个脉冲,计数值+1。计数值和脉冲数一一对应。但是如果输入脉冲的频率过高,超过了1/4倍的fCK_INT时,就需要对ETR信号进行预分频,以确保定时器能正常工作。fCK_INT=72MHz情况下,可算出,高于72/4=18MHz的信号必须做ETR预分频。本项目中传送带速度约为每秒1个工件,频率只有1Hz,远小于18MHz,无需ETR分频,设定为1即可。假如输入脉冲频率较高,例如=40MHz,就应该做ETR4分频或者8分频,如果做4分频,会降到10MHz,这样定时器才能正常工作。3、占用引脚通用定时器使用的TIMx_ETR引脚如表6.2.1所示。表6.2.1通用定时器的ETR引脚TIM编号引脚名复用引脚TIM2TIM2_CH1_ETRPA0(默认)/PA15(部分重映像)TIM3TIM3_ETRPD2(默认)TIM4TIM4_ETRPE0(默认)TIM5TIM5_ETR-其中TIM5没有ETR引脚,TIM2的ETR引脚叫TIM2_CH1_ETR。如果使用通用定时器,电路设计时只能使用这4个引脚。这里仍然选用PA0,以便调试时可以利用开发板上的K_UP按键代替传感器。系统方案及电路设计系统方案和电路设计如图6.2.2所示,与任务6.1相同。图6.2.2系统方案、传感器电路、数码管电路(四)程序设计与调试1、程序流程设计按照以上分析,可以利用TIM2_CH1_ETR引脚进行脉冲信号输入,利用外部时钟模式1或模式2进行计数。程序流程与任务6.1完全相同。图6.2.3程序流程2、搭建框架(1)复制文件夹:06-01-工件计数-通用计数器-外部时钟模式1-路径1,修改副本文件名为:06-02-工件计数-通用计数器-外部时钟模式2,如图6.2.4所示;(2)双击Workpiece,打开keil5。图6.2.4程序框架3、主程序设计与调试将主程序中的TIM5替换为TIM2即可。4、定时器程序设计与调试将原程序中所有的TIM5替换为TIM2;修改32行的TIM重映射语句,确保TIM2_CH1_ETR使用PA0引脚;修改41行,将时钟源设为:TIM_CLOCKSOURCE_ETRMODE2(外部时钟模式2)。修改42行,极性设为TIM_CLOCKPOLARITY_NONINVERTED(不取反)。5、数码管程序设计与调试不变。6、软硬件联调(1)连接电路,连接开发板到计算机;(2)在“Options”中找到开发板的IDCODE并进行复位、下载和启动设置;(3)编译、生成、下载程序到开发板;(4)按下K_UP或用手反复遮挡光电传感器,模拟工件到来效果。观察程序运行效果。如果不正确,修改程序或电路直到运行结果正确。(5)修改时钟分割系数ClockDivision为DIV4,滤波系数ClockFilter为15,观察效果。(6)修改ETR预分频系数ClockPrescaler为DIV4观察效果。(7)修改为TIM_CLOCKSOURCE_ETRMODE1(外部时钟模式1——ETR输入),下载后观察结果。故障现象:解决办法:原因分析:

三、要点记录及成果检验任务6.2利用TIMx_ETR引脚实现工件计数显示姓名学号日期分数(一)自主设计1、用TIM4_ETR引脚和外部时钟模式2,完成如下功能:每按下按键3次,计数加1并显示,加到100自动清0。请画出电路图,写出程序并调试。

任务6.3利用计数器更新中断实现打包操作一、任务目标任务目标:掌握利用外部时钟模式和更新中断,实现各种操作的方法。具体工作任务:利用TIMx_ETR引脚或TIMx_CH引脚、外部时钟模式2或模式1及更新中断,实现打包操作:即每来6个工件,启动电磁阀动作1秒。二、学习与实践(一)讨论与发言请结合任务1和任务2,谈一谈本任务的设计思路。请阅读以下资料并按照指示的工作顺序完成任务。。(二)方案及电路设计图6.3.1系统方案及电路设计参考任务6.1和6.2,传感器仍可接PA0引脚,作为TIM5_CH1或TIM2_CH1_ETR。此外应增加电磁阀及驱动电路。可参照项目2的电加热器驱动电路,设计电磁阀驱动电路。PC7输出低电平→三极管导通→继电器线圈得电→继电器触点闭合→电磁阀得电→做打包动作;PC7输出高电平→三极管截止→继电器线圈失电→继电器触点断开→电磁阀失电→停止打包。(三)程序设计与调试设计思路在任务6.1和6.2中,我们已经知道,将定时器设置为加计数器时,如果计数值>ARR,计数值就会自动重装(更新)为0,同时申请中断。这个中断也称为定时器更新中断。如果编程时允许更新中断,CPU就会在自动重装后跳到对应的中断服务程序。因此我们可以:(1)利用TIM5_CH1(PA0)引脚接收传感器输入,设置TIM5为外部时钟模式1,TI1输入,加计数。(2)设置ARR=5,当第6个工件到来时,计数值重装(更新)为0。(3)开启定时器5更新中断。当第6个工件到来、计数值重装为0时,申请更新中断。(4)在定时器5更新中断程序中开启和关闭电磁阀。2、流程设计图6.3.2程序流程3、搭建框架(1)复制文件夹:06-01-工件计数-通用计数器-外部时钟模式1-路径1,修改副本文件夹名为:06-03-工件打包-通用计数器-外部时钟模式1-TI1-中断,如图6.3.3。(2)修改工程名为:workpiece_pack。(3)复制文件夹LED,并修改文件夹和其内两个文件名为valve。(4)打开工程后注意检查Project窗口和Options中的IncludePaths中至少应包含seg、timer、valve相应文件。图6.3.3框架搭建4、主程序设计与调试第5、15行增加了电磁阀初始化内容。为使用滴答延时,第2和12行是关于滴答时钟的内容。为满足每6个工件中断一次,第13行ARR设定值送6-1。5、电磁阀程序设计与调试在valve.h中将PC7引脚命名为valve,在valve.c中对PC7做了初始化。6、定时器程序设计与调试timer.h文件中增加了对valve.h和Systick.h的包含语句。timer.c的第18行修改为从原来的Start,修改为Start_IT,启动定时器并开启中断。(3)timer.c的第47~49行,用于初始化NVIC。(4)第59~70行是定时器中断函数。本系统,每来6个工件,进中断程序。第60行对中断做一般性处理。清除中断挂起位。第64~70行对中断做专门处理。第66行打开电磁阀,做打包动作。第67行延时1S。第68行,撤除打包动作。这里用滴答定时器实现延时。7、数码管程序设计与调试无需修改,不再列出。8、软硬件联调(1)连接电路,连接开发板到计算机;(2)在“Options”中找到开发板的IDCODE并进行复位、下载和启动设置;(3)编译、生成、下载程序到开发板;(4)反复操作K_UP按键,模拟工件到来效果,观察数码管显示和继电器动作情况。如果不正确,修改程序或电路直到运行结果正确。(5)修改时钟分割系数ClockDivision为DIV4,滤波系数ClockFilter为15,观察效果。(6)为了留出足够的观察和测试时间,可以将滴答延时时间加大到5S。(7)观察本程序有什么缺点。(8)想一想,利用ETR引脚外部时钟模式1实现如上功能,该怎么改程序?(9)想一想,利用ETR引脚外部时钟模式2实现如上功能,该怎么改程序?故障现象:解决办法:原因分析:(四)程序改进与调试1、问题发现及解决方案通过以上调试,你会发现程序虽然能完成任务,但也存在一个缺点:当第6个工件到来时,程序能立即跳到中断程序开启电磁阀,但是工件数显示却保持在5个,不能及时显示为0。延时期间如果又按下按键,新增加的数值也不能马上显示出来,延时时间越长,问题越明显。你会发现计数值的更新需要等到延时结束。这是由于滴答延时占用了CPU的执行时间,延时期间,程序一直停留在中断程序里,无法返回主程序进行计数值读取与更新显示的缘故。图6.3.4软件延时的影响解决的办法是再开启一个定时器例如TIM2,如图6.3.5。这样我们的程序中就会有两个定时器,一个TIM5,做计数器用;一个TIM2,做定时器用。TIM5计数到6,进TIM5中断开启电磁阀,同时启动TIM2计时。TIM2时间到,进TIM2中断关闭电磁阀,停止计时。由于开启和关闭TIM2后会立即回到主程序,不会影响计数值的显示。由此我们可以体会到合理运用中断的优越性。图6.3.5用TIM2更新中断实现硬件延时2、框架搭建复制文件夹:06-03-工件打包-通用计数器-外部时钟模式1-TI1-中断,修改副本文件名为:06-03-工件打包-通用计数器-外部时钟模式1-TI1-中断2个,如图6.3.6。图6.3.6用TIM2更新中断实现硬件延时3、主程序设计与调试5和18行增加了电磁阀相关内容。6和7行定义了两个定时器操作变量。14、16行将原来的一个定时器初始化函数变成两个。为区分方便,用了不同的名字。定时器5做计数器,计数满6个清0。定时器2做定时器,1S延时。如果希望2S,2000-1改成4000-1即可。4、定时器程序设计与调试(1)timer.h第6和7行的函数名响应改变。(2)timer.c的第3和4行是定时器5和2的操作变量声明。7~16行是定时器5初始化函数。初始化完成直接启动TIM5及其中断。19~28行是定时器2初始化函数。注意初始化完成后并未启动定时器。第34~72是定时器5和定时器2初始化时都会隐性调用的函数。其中第37~59行用于定时器5初始化;第60~71用于定时器2初始化。第75~78行是定时器5中断一般处理。第80~83行是定时器2中断一般处理。第85~96行是定时器中断专门处理。无论定时器5还是定时器2中断,都会隐性调用这个函数。其中第86~90行用于定时器5中断,定时器5计数满后自动进入:开启电磁阀,开启定时器2及其中断,因此定时器2开始计时。定时器2时间到,就产生定时器2中断,执行第91~95行:关闭电磁阀,关闭定时器,于是定时器2停止计时。本系统数码管和打包电磁阀都使用PC7引脚,二者有冲突,这种冲突一般应避免。但考虑到PC7连的是数码管的小数点,作为小数点数码管程序始终输出1(灭),因此将PC7作为打包控制输出也是可以的,在电路设计中,不要把PC7连到数码管上即可。但如果电路已将PC7连到数码管,可以在编程时做些处理,防止数码管程序的干扰。所以在第2行增加了一个全局变量Pack_Status,在89和94行根据valve也就是PC7的状态给Pack_Status赋值。在后面的数码管程序中会用到这个变量。电磁阀程序设计与调试无变化。数码管程序设计与调试seg.c的第2行增加了变量Pack_Status的声明。第31行对Seg_Ones做了修正。由于共阳极段码表的第7位肯定为1,查表后,Seg_Ones的第7位总是1。如果不修正,执行33行后,PC7引脚就会输出1。如果定时器5计数满6个,就会进入TIM5中断,在timer.c的第87行执行valve=0,即向PC7引脚写0。之后很快返回主程序。返回主程序干什么?执行主函数的20和22行,取计数值,调数码管函数。于是PC7立刻被写1,这导致打包动作立刻被取消。可见数码管函数干扰了打包动作。加入第31行的修正计算就不同啦。将Seg_Ones和Pack_Status做按位与运算。按位与的规律是:任何位和“0”与,结果为“0”,任何位和“1”与,结果保持。如果Pack_Status=0x7f,即01111111,则Seg_Ones的D7位被清0;第33行执行后,PC7=0,与打包结果相同。如果Pack_Status=0xff,即11111111,则Seg_Ones的D7位被保持为查表结果,也就是1;第33行执行后,PC7=1,同样与打包结果相同。这就保证了数码管程序不会对打包结果造成干扰。软硬件联调调试过程与之前相同,可以将延时时间给大点,以方便观察和测试。在此基础上:(1)修改时钟分割系数ClockDivision为DIV4,滤波系数ClockFilter为15,观察效果。(2)屏蔽seg.c的第31行,观察会出现什么现象?(3)想一想,之前利用滴答延时实现打包的程序也存在数码管引脚和打包引脚冲突的问题,数码管程序没做数值修正,为什么我们却能看到打包动作?(4)利用TIM_ETR引脚实现以上功能,该怎么改程序?故障现象:解决办法:原因分析:

三、要点记录及成果检验任务6.3利用计数器更新中断实现打包操作姓名学号日期分数(一)自主设计1、用TIM4_ETR外部时钟模式2完成如上打包功能,请画出电路写出程序。2、用TIM3外部时钟模式1,完成如下功能:每按下按键5次,流水灯状态左移1位。请画出电路图,写出程序并调试。

任务6.4STM32软硬件深入(六)任务目标理解STM32滤波原理,能根据干扰信号的频率,确定滤波系数;对影子寄存器的机制有初步认识;初步了解定时器捕捉功能及其应用场合。学习与实践(一)STM32滤波原理及滤波系数选择干扰信号对计数值的影响实际系统送入定时器的外部脉冲信号常常叠加着各种干扰,干扰信号的存在使本该稳定的高低电平上出现了额外波动,如图6.4.1所示。如果不过滤掉这些干扰,多出来的触发沿肯定会造成计数错误。一般来说,干扰存在过程中的抖动越频率(干扰频率越高)、干扰存在的时间越长,产生的干扰触发沿就越多;采样频率越高,对干扰越敏感,越容易采集到干扰带来的触发沿。图6.4.1干扰信号的叠加效果按键的抖动也是一种干扰,它会造成一次按键却出现多个触发沿。之前我们采用延时的办法,检测到上升沿后,延时10~20ms,从而避免采集到多余的干扰沿。这实际上是一种降低信号采集频率,从而降低对干扰敏感度的滤波方法。STM32TIM滤波器的滤波原理如图6.1.1,STM32定时器内部带有滤波电路,可以对对来自TIMx_CH或TIMx_ETR引脚上的外部脉冲进行滤波处理。其滤波策略有两种:(1)通过降低采样频率滤除干扰图6.4.2适当降低采样频率,可滤除干扰如图6.4.2,原本只有2个低电平和2个高电平的信号上叠加了多个干扰。可以看出,按照采样频率f1进行采样,干扰不能滤除。降低采样频率到f2,干扰全部被滤掉。可见适当降低采样频率可以过滤掉高频干扰。当然,采样频率也不能过低,那样可能会将真正的信号变化也过滤掉。实际应用时应该根据干扰信号的频率选择合适的采样频率。(2)通过对N次采样结果进行比较滤除干扰在采样频率一定的情况下,如果连续N次采样采入的电平都相同,说明信号是稳定的,数据有效;否则说明信号有波动、不稳定,很可能是干扰造成的,数据应该被丢弃。适当增加N值,可提高抗干扰能力。图6.4.3中,原本只有2个低电平和2个高电平的信号上叠加了许多干扰。按照图示的采样频率,如果取N=1,就是认为每一个采样值都有效,这显然不能过滤掉叠加在信号上的干扰带来的多余上升沿(和下跳沿)。如果取N=2,需要连续采到2个“0”或者2个“1”数据才有效。但从图中可以看到,干扰发生期间,采到的信号恰好总是“0”、“1”、“0”、“1”地变化,做不到连续2个“0”或者2个“1”,于是这些数据都被抛弃了,只留下那些符合条件的信号,我们看到,干扰被全部过滤掉。图6.4.3采样脉冲不变情况下,N=2时,干扰被全部过滤掉图6.4.4相对图6.4.3,干扰信号的脉宽增加了,干扰信号被连续2次采集到的概率相应增加,我们看到,N=2情况下,没能完全过滤掉干扰,N=3就很好了。图6.4.4干扰信号变宽了,增大N到3时,干扰被全部过滤掉可见实际应用中,应该根据干扰信号和采样频率频率选择合适的N值,才能得到理想的滤波效果。一般需要N×T采样>t干扰,即N>t干扰×f采样,才可以过滤掉干扰。图6.4.5t干扰/T采样=5,N至少应取6才可滤掉干扰从图6.4.5可以看出,t干扰/T采样=5,N至少应取6。注意如果干扰高低电平时间不相等,取最大者。例如:f采样=0.5625MHz,t干扰=10μs,N应大于5.625,可以取6或7以上数值。滤波系数的选择在编程时,我们需要声明的是滤波系数和时钟分割系数,它们共同决定了f采样和N的取值。允许的滤波系数是0~15,与f采样及N的关系如表6.4.1所示。从表中可以看出:表6.4.1滤波系数与f采样和N的关系滤波器系数采样频率f采样采样数N滤波器系数采样频率f采样采样数N0fDTS18fDTS/861fCK_INT29fDTS/882fCK_INT410fDTS/1653fCK_INT811fDTS/1664fDTS/2612fDTS/1685fDTS/2813fDTS/3256fDTS/4614fDTS/3267fDTS/4815fDTS/328当滤波系数设置为0时,采样频率=fDTS,采样数N=1;当滤波系数设置为15时,采样频率=fDTS/32,采样数N=8。那么fDTS又是什么?fDTS是采样基准频率,其大小取决于程序中时钟分割系数的设置。时钟分割系数设定为:TIM_CLOCKDIVISION_DIV1:fDTS=fCK_INT时钟分割系数设定为:TIM_CLOCKDIVISION_DIV2:fDTS=fCK_INT/2时钟分割系数设定为:TIM_CLOCKDIVISION_DIV4:fDTS=fCK_INT/4假如定时器的工作时钟fCK_INT=72MHz,时钟分割系数设定为:TIM_CKD_DIV4,则fDTS=fCK_INT/4=72MHz/4=18MHz。按照表6.4.1:滤波系数设置为14时,f采样=fDTS/32=0.5625MHz,N=6,t干扰<6/0.5625≈10.67us,即高/低电平时长小于10.67us的干扰可以被过滤掉。假设干扰为方波,则f干扰=1/(2t干扰),可以计算出STM32能过滤掉的干扰信号频率范围:滤波系数=0、时钟分割系数=1:f干扰=f采样/(2N)=fDTS/2==fCK_INT/2=72/2=36MHz;即高于此频率的干扰会被过滤;滤波系数=15、时钟分割系数=4:f干扰=f采样/(2N)=fDTS/(32×2×8)==fCK_INT/(4×32×2×8)=72/(4×32×2×8)≈35KHz;即高于此频率的干扰会被过滤。如果希望进一步降低滤波频率的阈值,可以采样外部时钟模式2。这种模式下,路径上还有一个ETR预分频器。适当增大ETR预分频系数

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论