二次仪表频率计设计毕业论文(编辑修改稿)内容摘要:

计算。 STM32 系统配置和初始化 本系统程序采用 Keil uVision4 进行编写、编译和调试仿真。 使用 STM32 标准外设库函数 进行开发,从而不必关心底层寄存器的配置,减少了工作量,缩短了开发周期。 STM32 外部接 8MHz 晶振,通过内部 PLL 可以让系统频率达到 72MHz。 STM32 时钟包括 AHB 高速系统时钟总线、 APB2 高速外设时钟总线和 APB1 低速外设时钟总线。 调用 SystemInit(),配置 AHB和 APB2 时钟为 72MHz, APB1时钟为 36MHz。 另外用到的端口和外设也要对其时钟进行配置。 SystemInit()。 淮南师范学院 20xx 届本科毕业论文 11 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE)。 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE)。 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE)。 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE)。 STM32 输入捕获和定时器 STM32 输入捕获的原理是当选定的输入引脚发生选定的脉冲触发沿(上升沿或下降沿)的时 候,该时刻定时器的计数值 TIMx_CNT 会被保存 ,同时也会产生捕获中断。 本设计的思想是用定时器计时,输入捕获进行计数,所以需要配置定时器和输入捕获模式。 定时需用普通定时器 TIM2,首先对 TIM2 的时钟进行配置,由于 TIM2 内部是接在 APB1 的时钟总线上,因此调用库函数配置定时器时钟如下: RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE)。 为了每秒钟读取一次捕获脉冲计数值,需要配置装载寄存器,并且开启定时中断,当定时时间到的时候进入中断函数进行处理。 具 体的配置如下: TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure。 = 10000 1。 = 7200 1。 = 0。 = TIM_CounterMode_Up。 TIM_TimeBaseInit(TIM2, amp。 TIM_TimeBaseStructure)。 TIM_ITConfig(TIM2,TIM_IT_Update, ENABLE)。 TIM_Cmd(TIM2, ENABLE)。 STM32 是抢占式内核,允许中断嵌套,每个中断拥有一个优先级,高优先级的中断可以打断低优先级的中断。 当优先级相同时,根据中断向量表中默认的排列顺序进行中断响应。 所以 STM32 开启定时器需要对中断向量表进行配置。 NVIC_InitTypeDef NVIC_InitStructure。 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0)。 = TIM2_IRQn。 = 1。 = ENABLE。 二次仪表频率计设计 12 NVIC_Init(amp。 NVIC_InitStructure)。 配置好中断向量表,必须给中断一个入口函数,当 中断到来的时候可以找到这个函数,进行相应的处理。 下面的就是 TIM2 的中断入口函数: void TIM2_IRQHandler() { //判断增计数中断标志位置位 if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) { //清除中断标志 TIM_ClearITPendingBit(TIM2, TIM_IT_Update)。 //进行相应的算法处理 …… } } 输入捕获模式用以捕捉脉冲信号进行计数。 本系统选择 TIM4 的 Channal2通道( )作为脉冲输入引脚。 这里需要开启 TIM3 时钟和 GPIOA时钟: RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE)。 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIO B, ENABLE)。 作为脉冲捕获引脚需要配置为浮空输入模式: = GPIO_Pin_8。 = GPIO_Mode_IN_FLOATING。 GPIO_Init(GPIOB, amp。 GPIO_InitStructure)。 对输入捕获模式的配置主要包括输入通道、上升沿捕获方式、捕获预分频和输入脚是否滤波等,这里开启捕获中断进行计数,数据处理放在定时中断中。 TIM3 输入捕获模式详细的配置如下: = TIM_Channel_2。 = TIM_ICPolarity_Rising。 = TIM_ICSelection_DirectTI。 = TIM_ICPSC_DIV1。 = 0x00。 TIM_PWMIConfig(TIM4, amp。 TIM_ICInitStructure)。 TIM_SelectInputTrigger(TIM4, TIM_TS_TI2FP2)。 淮南师范学院 20xx 届本科毕业论文 13 TIM_SelectSlaveMode(TIM4, TIM_SlaveMode_Reset)。 TIM_SelectMasterSlaveMode(TIM4, TIM_MasterSlaveMode_Enable)。 TIM_Cmd(TIM4, ENABLE)。 TIM_ITConfig(TIM4, TIM_IT_CC2, ENABLE)。 定时器 TIM2 一秒的定时时间到的时候会进入定时中断函数,在这里首先关闭定时器,读取输入捕获计数值就可以得到频率了。 将脉冲计数器清零后重新开启定时器之后退出定时中断。 人机界面程序设计 人机交互界面程序设计包括 LCD128x128 程序设计、 LED 状态指示灯设计和按键输入程序设计。 LCD128x128 显示 LCD128x128 程序包括液晶初始化函数、写命令函数、写数据函数、清屏函数、以及汉字和字符的显示。 初始化需要配置控制端口和数据端口,并严格遵守写入数据和写入命令时序。 时序图如图 12 所 示。 图 12 LCD128x128 写入时序图 初始化和读写函数只需要遵守时序并且发送正确的命令字即可。 本部分程序主要是实现汉字和字符的显示。 由于液晶不带字库,需要程序里添加字库。 这里采用字库生成软件 PCtoLCD20xx 生成 C 格式字库数据,如下所示: 其中 Stru_GB16 结构体定义为: typedef struct 二次仪表频率计设计 14 { uint8 Index[2]。 uint8 Msk[32]。 }Stru_GB16。 这样每次检索结构体中的 Index 成员,如果是对应的汉字则将成员数组Msk 的数据显示出来。 本 部分实现的接口函数如下: void GUI_DispString(uint8 Row, uint8 Col, uint8 *str)。 void GUI_DispUnString(uint8 Row, uint8 Col, uint8 *str)。 void GUI_DispHZ(uint8 Row, uint8 Col ,uint8 *PStr)。 void GUI_DispUnHZ(uint8 Row, uint8 Col ,uint8 *PStr)。 按键和指示灯 按键由于输入端口没有上拉 电阻,需要配置内部上拉输入。 = GPIO_Mode_IPU。 当检测输入电压为低时则认为按键被按下。 由于操作按键的时候存在抖动,所以需要软件“消抖”,消抖可以用状态机消抖也可以简单地延时消抖。 本设计为了采用延时策略,当检测到按键输入引脚为低电平时,延时 30ms 再次读取,如果仍然是低电平则确认按键被按下。 单片机读取 IO 电平状态的函数为: GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)。 //读取 脚电平 四分别 按键设置为功能键、增大间、减小键和确认键。 考虑到频率计获取频率之后需要现场转化成与一次仪表相同的物理值,这就需要用户输入参数进行标定。 例如用户设定频率是 200Hz的时候温度是 20℃,频率 800Hz的时候是60℃,那么频率计会根据线性转换公式 y=ax+b 计算出 a、 b 值。 当有频率输入时自动显示转换后的物理数值。 换算方程式如下: phyval。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。