免费预览已结束,剩余16页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
安徽建筑工业学院 计算机控制技术课程设计简易低频数字相位测量仪基于飞思卡尔XS128芯片院系:机电学院设计人员: 班级:08自动化二班学号:08210030 指导老师:汪萍一课题目的(1)熟练掌握电子系统的设计方法(2)设计并实现一个简易的低频数字相位测量仪表二.设计内容将两路1KHz的正弦波信号分别送到两个过零比较器,使双极性的正弦波编程单极性的方波。若两路正弦波信号存在相位差,那么两路方波也必然存在相同的相位差值。将两路方波存在的相位差对应的时间间隔作为单片机的计数时间T1,即可得到两路正弦波的相位差,相位差=T1/T*360度。T=1/f=0.0001S三.所用器材(1)飞思卡尔MC9S12XS128单片机(2)Codewarrior IDE软件(3)龙丘单片机芯片配套BDM下载器(4)OCMJ4X8C 液晶LCD模块(5)5V电源模块若干(含电池) (6)导线若干四.参考资料(1)XS128单片机技术手册(2)OCMJ4X8C液晶说明书(3)Codewarrior软件基础使用说明五设计步骤1.方案论证方案一:将被测量输入信号通过模拟鉴相器鉴相,将模拟鉴相器的输出电压进行A/D转换,由单片机处理后显示数据。单片机低通滤波 /A/D转换鉴相器方案二:将被测量信号输入波形经比较器整形后,利用门电路鉴相,在通过RC电路积分后进行A/D转换。根据相位差与电平成正比的关系,由单片机经过查表或简单的计算处理后得到相位差值。方案三:鉴相部分与方案二相同。将整形出来的两路数字信号相与后,形成新的数字信号,用单片机测量出其波形宽度,经过简单的换算后,即可以得出要测量的相位差值。经过比较,方案一中被测信号的输出电压幅值变化比较大,难以满足鉴相器的输入要求。方案二中,积分电路输出波动会很大,相位精度不能保证。方案三的相位精度受频率影响小,容易控制,稳定性高,可以实现较高的精度,因此采用此方案。其系统框图如下:过零比较器整形电路MC9S12XS128单片机OCMJ4X8C LCD显示U1U2AB2.基本原理两路1KHz的正弦波信号U1、U2经过过零比较器后变成单极性的方波信号A、B,若U1、U2存在相位差,则A、B也存在相位差,为了测得相位差的值,我们可以将A、B经过数字逻辑电路处理,将B信号取反后与A信号相与,则可得到相位脉波,通过测定相位脉波和A、B任意一脉波的长度,相比较则可得相角脉波。测定脉波长度采用计数器计数方式,当相位脉波上升沿(下降沿)到来时读此时计数器的值设为phase_last,等到下降沿(上升沿)到来时读此时的计数器值设为phase_now,将两者相减即得相位脉波长度计数值。测A、B频率可同理得之,只是,A、B的频率需要两个同样的上升沿或下降沿,而相位脉波是两个相邻的触发沿。假设去经过数字逻辑电路处理后的相位脉波(设为C),再去一路脉波A,通过单片机采集脉波长度计数值,经过数学处理后得到相应的相角度数和频率。具体如下:将C接单片机的T0口,通过T0口的输入捕捉功能(即脉波产生跳变时触发)和累加器功能(计数),当C的任一触发沿(上升沿或下降沿)到来时,读此时的累加器值,等到下一个触发沿到来时,读取第二次值,两者相减即可得计数数值。测频率的计数值同理得之(注意必须是同一个相邻的上升沿或下降沿)。3.硬件电路设计(1)5V稳压电源电路采用LM2940 5V稳压芯片,配合电容滤波,从VCC和GND两端即可得到比较稳定的5V电源(2)正弦整流成方波电路采用一个单门限电压比较器(如图3.4所示),当输入信号每通过一次零时触发器的输出就要产生一次突然的变化。当输入正弦波时,每过一次零,比较器的输出端将产生一次电压跳变,它的正负向幅度均受到供电电源的限制,因此输出电压波形是具有正负极性的方波。为了使电路的抗干扰能力得到提升,我们在单门限电压比较器的基础上引入了正反馈网络。由于正反馈的作用,它的门限带电压随着输出电压U0的变化而改变,因此提高了抗干扰能力。(3)单片机及外围接口电路单片机供给经过lm2940稳压芯片后的5V电压,由7.2V的电池给LM2940提供电源。单片机上P1口接T0口,P7口接T1口,实现生成的PWM给输入捕捉和计数端口T。单片机的基本I/O口PORTB(8位口)接液晶的DB0DB7口,液晶的VDD和PSW相连,VDD、LEDA分别接5V正极,VSS、LEDK接5V负极。总体电路完工。4程序设计(1)锁相环void pll(void) REFDV=0x01;/PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1) SYNR =0x03;/ =2*16M*4/2=64M while (!(CRGFLG & 0x08); /等待时钟频率已稳定锁相环频率已锁定 CLKSEL=0x80;/BUSCLK=pllclk/2=32M经过锁相环后,始终周期超频到32M,使得计数值更精确。(2)输入捕捉部分/*捕捉脉波初始化*/void vinterruptsinit(void) TSCR1=0x80;/TIMER 定时器禁止 TIE =0x00;/禁止中断 TCTL3=0x00;/EDGnB EDGnA 1表示上升沿, 2表示下降沿, 3表示任何沿 TCTL4=0x0b;/通道0任何沿触发,通道1下降沿触发 TIOS =0x00;/每一位对应通道的: 0输入捕捉,1输出比较 TIE_C1I=1;/通道1中断使能 TIE_C0I=1;/通道0中断使能/通道0 计数相位差/通道1 计数频率/*/(3)通道0、1中断服务程序/*计数相位差对应的计数值*/*通道0中断服务程序*/#pragma CODE_SEG _NEAR_SEG NON_BANKEDvoid interrupt 8 Port0_interrupt(void) TFLG1_C0F=1; /清除中断标志 if(Counter_t%2=0) phase_last = TC0; /TC0为对应0通道的累加器的值 else phase_now = TC0; phase = phase_now - phase_last; /求差值求相角对应的计数值/phase =(phase_now - phase_last + phase)/2;/通过求均值,可得到比较精确的相位差脉波计数值,然单片机内部产生的PWM波很稳定,故未采用这样做,实际中可如此 Counter_t+; /通过余2算法,计算相邻两个计数触发沿下的计数值,此程序中计数的值为 /非相位差的计数值,在主程序中通过公式换算后转化为要求的角度 /Counter_t为与余2算法配合使用的变量 #pragma CODE_SEG DEFAULT /*/ /*计数频率对应的计数值*/*通道1中断服务程序*/ #pragma CODE_SEG _NEAR_SEG NON_BANKED void interrupt 9 Port1_interrupt(void) TFLG1_C1F=1; /中断标志清0 if(Counter_f%2=0) frequency_last = TC1;/TC1为对应的1通道的累加器的值 else frequency_now = TC1; frequency = frequency_now - frequency_last;/求差值计算频率对应的计数值 /frequency = (frequency_now - frequency_last+frequency)/2; /通过求均值,可得到比较精确的频率计数值,然单片机内部产生的PWM波很稳定,故未采用这样做,实际中可如此 Counter_f+; /通过余2算法,计算相邻两个计数触发沿下的计数值,此程序中计数的值为 /非相位差的计数值,在主程序中通过公式换算后转化为要求的角度 /Counter_f为与余2算法配合使用的变量 #pragma CODE_SEG DEFAULT(4)主程序/*主函数*/void main(void) DisableInterrupts;/关总中断 LCD_ini();/LCD液晶初始化 pll();/锁相环初始化 pwm_ini();/PWM初始化 vinterruptsinit();/输入捕捉初始化 EnableInterrupts;/开总中断 for(;) phase_transformation =360-(double)phase/frequency*360;/计数值对应的相角度数转换公式 frequency_transformation = frequency/32; /计数值对应的实际频率数转换公式 LCD_control(phase_transformation,LCD_position_phase); /液晶显示相角 LCD_control(frequency_transformation,LCD_position_frequency); /液晶显示频率 delay(5000); /* wait forever */ /* please make sure that you never leave this function */5.调试与仿真(1)由于硬件电路无法实时得到,采用MC9S12XS128单片机上的PWM模块等效代替实际电路中产生的方波。PWM模块初始化及相关设置如下:/*PWM模块*/void pwm_ini(void) PWME=0x00;/禁止PWM PWMPRCLK=0x22;/预分频 CH_A=CH_B=BUS_FREQ/4=32M/4=8 PWMSCLA=4;/CH_SA=8M/(4*2)=1M (PWM 0 1 4 5 选择A SA为时钟源) PWMSCLB=4;/CH_SB=8M/(4*2)=1M (PWM 2 3 6 7 选择B SB为时钟源) PWMCTL_CON01=1;/PWM 0 1级联(舵机1) PWMCLK_PCLK1=1;/PWM1(01级联) 使用SA PWMCTL_CON67=1; /PWM 6 7级联 PWMCLK_PCLK7=1; /PWM7 使用SB PWMPOL=0xff;/极性选择 PWM07初始均为高电平 PWMCAE=0x00;/左对齐 PWMPER01=1000;/频率=CH_SA/1000=1KHz PWMDTY01=300;/占空比=PWMDTY01/PWMPER01 对应相角=PWMDTY01/PWMPER01*360 PWMPER67=1000;/产生频率为CH_SB/1000=1KHz的方波 PWMDTY67=500;/即对应占空比为50% PWME_PWME1=1;/使能PWM01 PWME_PWME7=1;/使能PWM67/*/通过PWM模块可生成比较标准的1KHz的方波,通过通道的级联可以时间计数值的精确。PWM01通道级联后产生的PWM波用于等效代替经过整流电路后生成的相角脉波,PWM67通道级联后产生的1 KHz方波用于测频率计数值。输入捕捉部分,没来一次有效的触发沿都会触发中断,在中断中读取累加器的值。(2)Codewarrior 在线实时仿真通过Codewarrior软件自带的实时仿真功能可得如下表所示对应关系,如下:PWMDTY01100200250300400理论上对应的相角/度367290108144Phase(仿真的相角/度)367290108144Frequency(仿真的频率/赫兹)10001000100010001000由图中的对应关系可知程序可以很好地实现对相角的检测。(3)LCD液晶仿真源代码部分如下a:变量定义部分/*LCD模块*/#define LCDData PORTB /lcd显示数据传送口#define LCDData_D DDRB /数据口方向寄存器#define LCDCtrl_D DDRM /控制口方向寄存器#define RS PTM_PTM2 /lcd寄存器选择信号PTM2#define RW PTM_PTM3 /读写信号接PTM3#define E PTM_PTM5 /lcd使能信号接PTM5#define LCD_position_phase 0x84 /液晶显示位置坐标#define LCD_position_frequency 0x94 uchar const table1=相位度数;uchar const table2=频率数值;uint num;uint LCD3;uint Data_lcd=0;char temp4;/*/b:LCD驱动部分/*LCD模块驱动*/void delay(uint i) /延时程序 while(-i); void read_busy() uchar busy; do RS=0; RW=1; E=1; busy=PORTB&0x80; E=0; while(busy);void write_lcd_command(uchar value) /read_busy(); delay(300); RS=0; RW=0;/delay(200); LCDData =value; E=1;/delay(200); E=0;/delay(600);void write_lcd_data(uchar value) /read_busy(); delay(300); RS=1; RW=0;/delay(200); LCDData =value; E=1;/delay(600); E=0;void LCDInit(void) delay(5000); write_lcd_command(0x30); /DL=1: 8-BIT 控制接口; RE=0: 基本指令集 delay(5000); write_lcd_command(0x01); /清除显示,即清屏 delay(5000); write_lcd_command(0x06); /进入点设定,I/D=1光标右移,AC自动加1; SH=0:整体显示不移动 delay(5000); write_lcd_command(0x0c); /D=1:整体显示ON; C=1:光标显示OFF; B=0:光标位置不反白闪烁(即整体显示、关游标、不反白)void int_char(uint LCD_lcd) LCD2=LCD_lcd%10; LCD1=(unsigned int)(LCD_lcd%100-LCD2)/10); LCD0=(unsigned int)(LCD_lcd/100);void LCD_ini(void) delay(10000); LCDData=0x00; LCDData_D = LCDCtrl_D = 0xFF; LCDInit(); delay(100); LCDInit(); delay(100); LCDInit(); delay(100); LCDInit(); delay(100); write_lcd_command(0x80); /在DDRAM地址0x80处显示相角度数 for(num=0;num8;num+) write_lcd_data(table1num); delay(10); write_lcd_command(0x90); /在DDRAM地址0x90处显示频率数值 for(num=0;num=0&LCD_data=10&LCD_data100) write_lcd_command(LCD_position);/当i=0时,本句及下句式显示数字0,其ASCII码就是0x33,液晶模块说明书最后一个表可查询ASCII码 delay(500); for(num=0;num=100&LCD_data1000) write_lcd_command(LCD_position);/当i=0时,本句及下句式显示数字0,其ASCII码就是0x33,液晶模块说明书最后一个表可查询ASCII码 delay(500); for(num=0;num=1000&LCD_data10000) write_lcd_command(LCD_position);/当i=0时,本句及下句式显示数字0,其ASCII码就是0x33,液晶模块说明书最后一个表可查询ASCII码 delay(500); for(num=0;num4;num+) write_lcd_data(tempnum); delay(10); write_lcd_data(0x20); /消零 delay(10); / delay(5000); / delay(5000); /*以上为LCD模块程序*/其中LCD_init()函数为液晶初始化部分,LCD_control()函数为主要执行部分,在主程序中调用,显示相应的数值。相关结果如下:当PWMDTY01=100时,即理论相角为36度时仿真结果当PWMDTY1=250时,即理论相角为90度时的仿真结果当PWMDTY01=300时,即对应的理论相角为108度时的仿真结果六、相关分析(1)首先由于硬件电路没有实际做,故可能出现的波形不稳定因素无法实时得知但是单片机读取的是整形后的方波,只要跳变存在,单片机便可方便读出。(2)对于测相角对应的计数值时,采用的是余2算法,计得是相邻两个触发沿的计数值,没有采用累加求均值算法,在波形良好的情况下结果很好,在杂波较多电路中可能精度降低(3)对于相角计数,由于是任意沿触发,我们无法得知是从上升沿先触发中断还是下降沿先触发(相角互补),实验中采用理论值和测定值之间的比较,得到转换公式,得到正确的相角值。(4)由于经过超频,计数值偏大,如果处理不好会出现溢出现象导致实验出错,本实验中对1KHz波形测定效果良好,如果频率过大或过小会出现不可避免的错误。七、总结心得自己写写吧,这就不帮了八、实验标准程序(含液晶部分)#include /* common defines and macros */#include derivative.h /* derivative-specific definitions */#include #include stdio.h /程序中使用了sprintf函数,必须声明其头文件/*LCD模块*/#define LCDData PORTB /lcd显示数据传送口#define LCDData_D DDRB /数据口方向寄存器#define LCDCtrl_D DDRM /控制口方向寄存器#define RS PTM_PTM2 /lcd寄存器选择信号PTM2#define RW PTM_PTM3 /读写信号接PTM3#define E PTM_PTM5 /lcd使能信号接PTM5#define LCD_position_phase 0x84 /液晶显示位置坐标#define LCD_position_frequency 0x94 uchar const table1=相位度数;uchar const table2=频率数值;uchar const table3=自动化二班;uchar const table4=童二宝制作;uint num;uint LCD3;uint Data_lcd=0;char temp4;/*/uchar Counter_f=0;/为余2算法提供比较值,脉波uchar Counter_t=0;/同上,频率uint phase_last=0; /两个方波经过门电路处理后相位差脉波,初始时任一沿触发时累加器计数值uint phase_now=0; /两个方波经过门电路处理后相位差脉波,下一个触发沿时累加器计数值uint phase=0; /两个方波经过门电路处理后相位差脉波所对应的计数值=phase_now-phase_lastuint frequency_last=0;/计算所给方波频率初始时任一下降沿时的累加器计数值uint frequency_now=0;/计算所给方波频率下一个下降沿时的累加器计数值uint frequency=0;/方波频率所对应的计数值=frequency_now-frequency_lastuint phase_transformation=0; /转换为标准相位差(单位度数,精确到0.01)uint frequency_transformation=0; /转换为标准频率数(单位Hz,精确到1)/*锁相环模块*/void pll(void) REFDV=0x01;/PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1) SYNR =0x03;/ =2*16M*4/2=64M while (!(CRGFLG & 0x08); /等待时钟频率已稳定锁相环频率已锁定 CLKSEL=0x80;/BUSCLK=pllclk/2=32M/*PWM模块*/void pwm_ini(void) PWME=0x00;/禁止PWM PWMPRCLK=0x22;/预分频 CH_A=CH_B=BUS_FREQ/4=32M/4=8 PWMSCLA=4;/CH_SA=8M/(4*2)=1M (PWM 0 1 4 5 选择A SA为时钟源) PWMSCLB=4;/CH_SB=8M/(4*2)=1M (PWM 2 3 6 7 选择B SB为时钟源) PWMCTL_CON01=1;/PWM 0 1级联(舵机1) PWMCLK_PCLK1=1;/PWM1(01级联) 使用SA PWMCTL_CON67=1; /PWM 6 7级联 PWMCLK_PCLK7=1; /PWM7 使用SB PWMPOL=0xff;/极性选择 PWM07初始均为高电平 PWMCAE=0x00;/左对齐 PWMPER01=1000;/频率=CH_SA/1000=1KHz PWMDTY01=100;/占空比=PWMDTY01/PWMPER01 对应相角=PWMDTY01/PWMPER01*360 PWMPER67=1000;/产生频率为CH_SB/1000=1KHz的方波 PWMDTY67=500;/即对应占空比为50% PWME_PWME1=1;/使能PWM01 PWME_PWME7=1;/使能PWM67/*/*捕捉脉波初始化*/void vinterruptsinit(void) TSCR1=0x80;/TIMER 定时器禁止 TIE =0x00;/禁止中断 TCTL3=0x00;/EDGnB EDGnA 1表示上升沿, 2表示下降沿, 3表示任何沿 TCTL4=0x0b;/通道0任何沿触发,通道1下降沿触发 TIOS =0x00;/每一位对应通道的: 0输入捕捉,1输出比较 TIE_C1I=1;/通道1中断禁止 TIE_C0I=1;/通道0中断禁止/通道0 计数相位差/通道1 计数频率/*/*LCD模块驱动*/void delay(uint i) /延时程序 while(-i); void read_busy() uchar busy; do RS=0; RW=1; E=1; busy=PORTB&0x80; E=0; while(busy);void write_lcd_command(uchar value) /read_busy(); delay(300); RS=0; RW=0;/delay(200); LCDData =value; E=1;/delay(200); E=0;/delay(600);void write_lcd_data(uchar value) /read_busy(); delay(300); RS=1; RW=0;/delay(200); LCDData =value; E=1;/delay(600); E=0;void LCDInit(void) delay(5000); write_lcd_command(0x30); /DL=1: 8-BIT 控制接口; RE=0: 基本指令集 delay(5000); write_lcd_command(0x01); /清除显示,即清屏 delay(5000); write_lcd_command(0x06); /进入点设定,I/D=1光标右移,AC自动加1; SH=0:整体显示不移动 delay(5000); write_lcd_command(0x0c); /D=1:整体显示ON; C=1:光标显示OFF; B=0:光标位置不反白闪烁(即整体显示、关游标、不反白)void int_char(uint LCD_lcd) LCD2=LCD_lcd%10; LCD1=(unsigned int)(LCD_lcd%100-LCD2)/10); LCD0=(unsigned int)(LCD_lcd/100);void LCD_ini(void) delay(10000); LCDData=0x00; LCDData_D = LCDCtrl_D = 0xFF; LCDInit(); delay(100); LCDInit(); delay(100); LCDInit(); delay(100); LCDInit(); delay(100); write_lcd_command(0x80); /在DDRAM地址0x80处显示相角度数 for(num=0;num8;num+) write_lcd_data(table1num); delay(10); write_lcd_command(0x90); /在DDRAM地址0x90处显示频率数值 for(num=0;num8;num+) write_lcd_data(table2num); delay(10); write_lcd_command(0x88); /在DDRAM地址0x90处显示自动化二班 for(num=0;num10;num+) write_lcd_data(table3num); delay(10); write_lcd_command(0x98); /在DDRAM地址0x90处显示童二宝制作 for(num=0;num=0&LCD_data=10&LCD_data100) write_lcd_command(LCD_position);/当i=0时,本句及下句式显示数字0,其ASCII码就是0x33,液晶模块说明书最后一个表可查询ASCII码 delay(500); for(num=0;num=100&LCD_data1000) write_lcd_command(LCD_position);/当i=0时,本句及下句式显示数字0,其ASCII码就是0x33,液晶模块说明书最后一个表可查询ASCII码 delay(500); for(num=0;num=1000&LCD_data10000) write_lcd_command(LCD_position);/当i=0时,本句及下句式显示数字0,其ASCII码就是0x33,液晶模块说明书最后一个表可查询ASCII码 delay(500); for(num=0;num4;num+) write_lcd_data(tempnum); delay(10); write_lcd_data(0x20); /消零 delay(10); / delay(5000); / delay(5000); /*以上为LCD模块程序*/*主函数*/void main(void) DisableInterrupts;/关总中断 LCD_ini();/LCD液晶初始化 pll();/锁相环初始化 pwm_ini();/PWM初始化 vinterruptsinit();/输入捕捉初始化 EnableInterrupts;/开总中断 for(;) phase_transformation =360-(double)phase/frequency*360;/计数值对应的相角度数转
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 计划-电路基础分析
- 产科虚拟教学平台在产科多学科协作教学中的应用
- 初中七年级劳动技术上册项目二《插花》教案-人教版
- 交叉设计在生物等效性试验中的法规符合性要点
- 创建文明校园演讲稿全新
- 初一数学期中考试检测题(有答案)
- 兵团科技计划项目申报书
- 出租合租房合同(5篇)
- 牙医口腔健康学习课件模板
- 乙肝病毒耐药的机制与应对策略
- 成熟男性性健康教育指南
- 2025年湖北省中考物理+化学合卷试题(含答案及解析)
- 鼻炎诊疗指导培训课件
- 塔里木大学《高等数学B级》2023-2024学年第一学期期末试卷
- 2025-2030中国聚羟基脂肪酸酯(PHA)行业发展状况与产销趋势预测报告
- 加气站风险评估报告
- 仓库食品发货管理制度
- 公司员工出门证管理制度
- XX公司年产10万吨阳极铜及5万吨铜杆项目环境影响报告书
- 陕西省专业技术人员继续教育2025公需课《党的二十届三中全会精神解读与高质量发展》20学时题库及答案
- 中医特色护理培训课件
评论
0/150
提交评论