中级会员
- 积分
- 276
- 威望
- 226
- 贡献
- 42
- 兑换币
- 20
- 注册时间
- 2008-4-2
- 在线时间
- 4 小时
|
<>#include <hidef.h> <BR>#include <mc9s12dg128.h> <BR>#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"<BR>//前排传感器的变量<BR>unsigned char AD_F[7]={0,0,0,0,0,0,0}; <BR>unsigned char AD_FMAX[7]={0,0,0,0,0,0,0};<BR>unsigned char AD_FMIN[7]={200,200,200,200,200,200,200};<BR>unsigned char AD_FMAXMIN[7]={0,0,0,0,0,0,0};</P><P> <BR>char i;<BR>unsigned char NEW=0; //有新AD数据产生的标志</P><P> </P><P>/******************************************************/<BR>void Init_PLL(void) //PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1)<BR>{<BR> REFDV=1;<BR> SYNR=2;<BR> while(!(CRGFLG&0x08));<BR> CLKSEL=0x80;<BR>}<BR>/********************************************************/<BR>/*******************************************************************/<BR>void Init_AD(void) <BR>{<BR>ATD0CTL2_AFFC=1; //快速标志位清除<BR>ATD0CTL2_ASCIE=1; //使能序列转换结束中断<BR>ATD0CTL3=0X38; //一次转换序列为1次转换,若为7次(后排)则为ATD0CTL3=0X38;<BR>ATD0CTL4=0X85; //8位精度,2个AD时钟的采样时间,5分频<BR>ATD0CTL5=0X90; //右对齐,无符号结果第1次从AN0开始<BR>}<BR>/**********************************************************/<BR>void delay_us(int time) <BR>{do<BR>time--;<BR>while(time>1);<BR>}</P><P><BR>/***************************************************************<BR> AD转换序列结束中断处理函数<BR>/***************************************************************/<BR>interrupt void AD_ISR()<BR>{ATD0CTL2_ADPU=0; //关AD转换<BR> PWME=0x00; //关PWM信号<BR> AD_F[0]=ATD0DR0;AD_F[1]=ATD0DR1;AD_F[2]=ATD0DR2;AD_F[3]=ATD0DR3;<BR> AD_F[4]=ATD0DR4;AD_F[5]=ATD0DR5; AD_F[6]=ATD0DR6; <BR> NEW=1;<BR> CRGINT=0x80; //开实时中断<BR> <BR>}<BR>/***************************************************************<BR> 实时中断初始化函数<BR>/*************************************************************/<BR>void Init_RTI(void) <BR>{ <BR> RTICTL=0x50; </P><P>} <BR>/*********************************************************<BR> 实时中断处理函数<BR>/*********************************************************/<BR>interrupt void RTI_ISR(void) <BR>{<BR> <BR> PORTA=0X01; // 关后排开前排通道<BR> CRGINT=0x00; //关实时中断 <BR> PWMCNT7=0; <BR> PWME=0x80; //开红外传感的PWM调试信号,开始新一轮的发光采样<BR> delay_us(150);<BR> ATD0CTL5=0X90; //右对齐,结果为无符号数,单转换序列,多通道转换从AN0开始<BR> ATD0CTL2_ADPU=1; //开通AD转换功能<BR> CRGFLG=0x80; //清本实时中断标志</P><P>}</P><P>/******************************************************<BR> pwm初始化<BR>/******************************************************/<BR>void Init_pwm(void) <BR>{ <BR>PWME=0x00; //初始化时关闭所有的PWM通道<BR>PWMCTL=0x80; //通道6,7级连<BR> //PWMCLK=0x00;选择7通道时钟为B<BR>PWMPOL=0x2A; //极性 <BR>PWMPRCLK=0X10; //时钟B频率为系统总线时钟的1/2<BR>PWMPER67=24000; //设置7通道的PWM频率为500HZ,即周期为2毫秒<BR>PWMDTY67=1200; //设置低电平占空比为5.5%,即低电平时间为110微秒 <BR>}<BR>/***************************************************/<BR> //找到每个传感器在赛道上的最大最小值 <BR> void find_mm()<BR> { <BR> if(NEW==1) <BR> {<BR> for(i=0;i<7;i++) <BR> {<BR> if(AD_F<i>>AD_FMAX<i>) AD_FMAX<i>=AD_F<i>;<BR> if(AD_F<i><AD_FMIN<i>) AD_FMIN<i>=AD_F<i>;<BR> AD_FMAXMIN<i>=AD_FMAX<i>-AD_FMIN<i>;<BR> } <BR> NEW=0;<BR> }<BR> <BR> } </P><P>/******************************************************<BR> 主程序<BR>******************************************************/<BR>void main(void)<BR>{<BR> DDRA=0XFF;<BR> PORTA=0X01;<BR> Init_PLL();<BR> Init_RTI();<BR> Init_AD(); <BR> Init_pwm();<BR> HPRIO=0XD2; //ATD0中断优先<BR> EnableInterrupts;<BR> PWME=0x80; //打开7通道<BR> delay_us(150);<BR> ATD0CTL2_ADPU=1; //打开AD转换通道 <BR> while(1) <BR> { find_mm(); //找到每个传感器在赛道上的最大最小值 <BR> }<BR>}</P><P>为什么这个程序PWM7出来只有1V多,这样正常吗?还请问这个程序进入各中断的顺序是怎样的啊?请各位大侠指教</P> |
|