当前位置:首页 > 第五届飞思卡尔智能车电磁组程序
Write_Position(1,4); //显示符号位 LCD_Write_Data(0x2D); //显示负号 LCD_disp_date(1,5,-change); //4位 } else
LCD_disp_date(1,5,change); //0123 }
void LCD_disp_speed(void){
LCD_Write_Cmd(0x01);//清屏
LCD_disp_date(0,0,NowSpeed); //data[].d最大值为255加上空格正好四位 LCD_disp_date(0,5,speed_return); //data[].d最大值为255加上空格正好四位 LCD_disp_date(0,10,speed_control);
LCD_disp_date(1,6,angle_control); //5678 }
/************************************************************************************
三 · 子函数模块
*************************************************************************************/
/************************************************************************
AD转换包括函数MAX(),MIN(),fun_ADC();
/ ***********************************************************************/
INT8U MAX(INT8U k) {
INT8U i,*q,max; q=a[k]; max=*q;
for(i=0;i<8;i++) if(*(q+i)>max) max=*(q+i); return max; }
INT8U MIN(INT8U m)
{
INT8U j,min,*p; p=a[m]; min=*p;
for(j=0;j<8;j++) if(*(p+j) /******************************************************************** 经过计算0.50ms即450us可完成一次AD转换 AD3ms定时刷新一次 *********************************************************************/ void fun_ADC(void){ INT8U i,j,max,min; INT16U sum; INT8U *q; static INT8U count; ATD0CTL5=0X20; //,连续AD转换,右对齐,单通道,无符号,起始通道为AN0 while(!ATD0STAT0_SCF);//等待左前第一个电感电压转换完成 q=a[0]; *(q) =ATD0DR0L; *(q+1)=ATD0DR1L; *(q+2)=ATD0DR2L; *(q+3)=ATD0DR3L; ATD0CTL5=0X21; //重置ATD0CTL5,将启动一次新的AD转换 while(!ATD0STAT0_SCF); //右前侧第一个电感电压转换完成 q=a[1]; *(q) =ATD0DR0L; *(q+1)=ATD0DR1L; *(q+2)=ATD0DR2L; *(q+3)=ATD0DR3L; ATD0CTL5=0X22; while(!ATD0STAT0_SCF); //左前侧第二个电感电压转换完成 q=a[2]; *(q) =ATD0DR0L; *(q+1)=ATD0DR1L; *(q+2)=ATD0DR2L; *(q+3)=ATD0DR3L; ATD0CTL5=0X23; while(!ATD0STAT0_SCF);// 右前侧第1个电感电压转换完成 q=a[3]; *(q) =ATD0DR0L; *(q+1)=ATD0DR1L; *(q+2)=ATD0DR2L; *(q+3)=ATD0DR3L; ATD0CTL5=0X24; while(!ATD0STAT0_SCF);//等待左前第一个电感电压转换完成 q=a[4]; *(q) =ATD0DR0L; *(q+1)=ATD0DR1L; *(q+2)=ATD0DR2L; *(q+3)=ATD0DR3L; ATD0CTL5=0X25; while(!ATD0STAT0_SCF);// 右前侧第1个电感电压转换完成 q=a[5]; *(q) =ATD0DR0L; *(q+1)=ATD0DR1L; *(q+2)=ATD0DR2L; *(q+3)=ATD0DR3L; /********************************************************* 再次启动一轮AD转换来减小误差 ***********************************************************/ ATD0CTL5=0X25; while(!ATD0STAT0_SCF);// 右前侧第1个电感电压转换完成 q=a[5]; *(q+4)=ATD0DR0L; *(q+5)=ATD0DR1L; *(q+6)=ATD0DR2L; *(q+7)=ATD0DR3L; ATD0CTL5=0X24; while(!ATD0STAT0_SCF);//等待左前第一个电感电压转换完成 q=a[4]; *(q+4)=ATD0DR0L; *(q+5)=ATD0DR1L; *(q+6)=ATD0DR2L; *(q+7)=ATD0DR3L; ATD0CTL5=0X23; while(!ATD0STAT0_SCF);// 右前侧第1个电感电压转换完成 q=a[3]; *(q+4)=ATD0DR0L; *(q+5)=ATD0DR1L; *(q+6)=ATD0DR2L; *(q+7)=ATD0DR3L; ATD0CTL5=0X22; while(!ATD0STAT0_SCF); //左前侧第二个电感电压转换完成 q=a[2]; *(q+4)=ATD0DR0L; *(q+5)=ATD0DR1L; *(q+6)=ATD0DR2L; *(q+7)=ATD0DR3L; ATD0CTL5=0X21; //重置ATD0CTL5,将启动一次新的AD转换 while(!ATD0STAT0_SCF); //右前侧第一个电感电压转换完成 q=a[1]; *(q+4)=ATD0DR0L; *(q+5)=ATD0DR1L; *(q+6)=ATD0DR2L; *(q+7)=ATD0DR3L; ATD0CTL5=0X20; //,连续AD转换,右对齐,单通道,无符号,起始通道为AN0 while(!ATD0STAT0_SCF);//等待左前第一个电感电压转换完成 q=a[0]; *(q+4)=ATD0DR0L; *(q+5)=ATD0DR1L; *(q+6)=ATD0DR2L; *(q+7)=ATD0DR3L; for(i=0;i<6;i=i+1) //累加后求均值,AD转换滤波 { sum=0; q=a[i]; //赋予指针新地址 for(j=0;j<8;j++) sum+=*(q+j); max=MAX(i); min=MIN(i); data[i].d=(INT8U)((sum-max-min)/6); } //1.记录100个0,5号控制电感的偏差值 r_change0=&road_change[99]; //指向数组最后一位 r_change1=&road_change[98]; //指向数组倒数第二位 while(r_change1!=road_change) { *r_change0=*r_change1;
共分享92篇相关文档