新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 单片机典型案例开发(六)

单片机典型案例开发(六)

作者: 时间:2013-07-13 来源:网络 收藏
PACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px; PADDING-TOP: 0px; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px">  运行在的底层软件主要负责ADC的采集、DAC的输出以及串口的通信,下面详细介绍各个部分:

  1、 光栅频率测量:测量模拟基准一个周期内的光栅个数

  在程序中,每次进入外中断0的处理程序void int0_isr(void)(即基准脉冲上升沿到来时)调用void do_gd_opt_frq()函数测量光栅频率。

  在do_gd_opt_frq ()函数中,先把前一次读取计数器1的计数值保存在全局变量time1_prev中,再读取计数器1的值并保存在time1_next中,因为两次中断的间隔就是模拟基准的周期,有一个光栅脉冲计数器1就加1,所以,前后两次的差值就是一个模拟基准周期内光栅的个数。

  2、 模拟基准幅度

  在INT0的中断处理函数中置一个全局标志refoa_gd_flag = 0xff,在一个100?s的定时器的中断处理函数中查询此全局标志,若置位,则对模拟基准的ADC通道连续采样400次,采样后清 refoa_gd_flag标志并置采样结束的标志refoa_gd_finished = 0xff。在主程序main()函数中不断查询refoa_gd_finished标志,若置位,则调用do_refoa_high()函数求出模拟基准幅度,然后清标志。在do_refoa_high()函数中求出采样400个点中的最大值和最小值,两者之差即为模拟基准幅度。

  3、 模拟基准周期:测量一个模拟基准周期的毫秒值

  在一个1ms的定时器溢出中断处理函数中,全局的计数变量ref_gd_count加1,ref_gd_count初始化为0。在外中断0的处理函数 int0_isr()中读取ref_gd_count的值,即为模拟基准的周期,再把ref_gd_count清零。这样,只有第一次测量值是无效的,以后均为有效的模拟基准周期。

  4、 模拟基准宽度

  在INT0的中断处理函数中置全局变量refoa_width_gd_ count=0,在100?s的定时器中断中查询外中断0的引脚是否为高电平,是高电平则refoa_width_gd_count加1,直至变为低电平,refoa_width_gd_ count的值就是模拟基准的宽度。

  5、 电地球波

  在do_ein()函数中处理工控机串口传过来的电地球波信息,如果是停止电地球波命令(state=0),通过DA电地球波直接输出高电平并清除电地球波使能标志位ein_gd_enable。如果是开始电地球波命令(state=1),把相位、宽度、幅值、斜率等信息赋给全局变量保存,并且计算出步距和斜率上各个点的输出值,置位电地球波使能标志 ein_gd_enable。

  电地球波的产生是以模拟基准为基准的,在INT0的中断处理函数中设置计数器的比较中断并使能。

  图3中, T0与T1 之间是地球波的相位,T2与T5之间是地球波的宽度。在T1时刻进入计数器1的比较中断timer1_compa_isr(),全局变量 ein_count_gd初始化为0,若ein_count_gd不等于1,则设置比较中断寄存器初值为下一步距点,并通过DA输出,若下一个比较中断到来ige ein_count_gd不等于1,则继续设置比较中断寄存器初值为下一个步距,并输出幅值,直到斜率上所有的幅值输出完毕,置ein_count_gd 等于1并设置比较中断寄存器,使T4进入比较中断。T4进入比较中断,并按照前述方法输出斜率上所有的幅值,完毕则禁止比较中断并置 ein_count_gd=0xff。

  

地球波的相位

  ADC采集和串口通信比较简单,这里不再赘述。



关键词: 单片机 典型案例

评论


相关推荐

技术专区

关闭