📄 主程序(有刹车2).txt
字号:
#include <hidef.h> /* common defines and macros */
#include <mc9s12dg128.h> /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"
unsigned char sam_atd_g[15]; //道路检测值
unsigned int table[29]; //方向表
unsigned char car_speed; //车速控制
//unsigned int check_v;
byte front1; //转向值1
byte front; //转向值
byte clock_f;
unsigned int strait[3];//直线各区域传感器所对应速度
unsigned int bend[5];//弯道各区域传感器所对应速度
unsigned char drive_flag; //方向标志,为1表示检测到有效路径
unsigned char start_acc; //统计检测起跑线次数
unsigned char start_flag; //起跑线标志位,为1表示检测到起跑线3次
unsigned char bend_f;
//unsigned char bendf2;
unsigned char bend_flag;
unsigned int clock;
unsigned int ad_limit=153;
unsigned int clock_limit=22000;
void crg_init(void); // 锁相环初始化
void atd_init(void); // AD转换初始化
void pwm_init(void); // PWM信号初始化
void sam_position(void);
void delay(void);
void check_bend(void);
void check_start(void);
void check_stop(void);
void table_init(void);
void chang_f(void);
void drive(void);
void check_v(void);
void c_comp(void);
void main(void) {
crg_init();
atd_init();
pwm_init();
table_init();
//check_va();
for(;;)
{
sam_position();
check_start();
if(bend_flag==1) {
PWMDTY7=0x00;
clock_f=1;
}
if(clock_f==1){
if(clock<clock_limit){
clock++;
c_comp();
drive();
} else{
clock=0;
clock_f=0;
bend_flag=0;
}
}
if(clock_f==0){
c_comp();
check_v();
}
}
}
void check_start(void) {
unsigned char i,j=0;
for(i=0;i<14;i++){
if(sam_atd_g[i]^sam_atd_g[i+1]) j++;}
if(j>4) {start_acc++; delay();}
if (start_acc==3) start_flag=1;
}
void check_stop(void){
if (start_flag==0)
PWME=0x00;
}
void drive(void){
if (drive_flag==1)
PWMDTY7=car_speed;
else
PWMDTY7=0;
}
void check_v(void){
drive_flag=0;
if(sam_atd_g[7]){
if(sam_atd_g[6]){
car_speed=17;
}
if(sam_atd_g[8]){
car_speed=17;
}
car_speed=17;
} else if(sam_atd_g[6]){
if(sam_atd_g[5]){
car_speed=16;
}
car_speed=16;
}else if(sam_atd_g[8]){
if(sam_atd_g[9]){
car_speed=16;
}
car_speed=16;
}else if(sam_atd_g[5]){
if(sam_atd_g[4]){
car_speed=17;
}
car_speed=15;
}else if(sam_atd_g[9]){
if(sam_atd_g[10]){
car_speed=17;
}
car_speed=15;
}else if(sam_atd_g[4]){
if(sam_atd_g[3]){
car_speed=16;
}
car_speed=17;
}else if(sam_atd_g[10]){
if(sam_atd_g[11]){
car_speed=16;
}
car_speed=17;
}else if(sam_atd_g[3]){
if(sam_atd_g[2]){
car_speed=15;
}
car_speed=16;
}else if(sam_atd_g[11]){
if(sam_atd_g[12]){
car_speed=15;
}
car_speed=16;
}else if(sam_atd_g[2]){
if(sam_atd_g[1]){
car_speed=14;
}
car_speed=15;
}else if(sam_atd_g[12]){
if(sam_atd_g[13]){
car_speed=14;
}
car_speed=15;
}else if(sam_atd_g[1]){
if(sam_atd_g[0]){
car_speed=13;
}
car_speed=14;
}else if(sam_atd_g[13]){
if(sam_atd_g[14]){
car_speed=13;
}
car_speed=14;
}else if(sam_atd_g[0]){
car_speed=13;
}else if(sam_atd_g[14]){
car_speed=13;
}
drive_flag=1;
}
/* void check_va(void){
int i;
unsigned int value1;
value1=17;
for(i=0;i<=2;i++){
strait[i]=value1;
value1--;
}
for(i=0;i<=4;i++){
bend[i]=value1;
value1--;
}
}
void v_comp(void)
{
drive_flag=0;
if(sam_atd_g[7]){
if(sam_atd_g[6]){
check_v=strait[0];
}
if(sam_atd_g[8]){
check_v=strait[0];
}
check_v=strait[0];
} else if(sam_atd_g[6]){
if(sam_atd_g[5]){
check_v=strait[1];
}
check_v=strait[1];
}else if(sam_atd_g[8]){
if(sam_atd_g[9]){
check_v=strait[1];
}
check_v=strait[1];
}else if(sam_atd_g[5]){
if(sam_atd_g[4]){
check_v=bend[0];
}
check_v=strait[2];
}else if(sam_atd_g[9]){
if(sam_atd_g[10]){
check_v=bend[0];
}
check_v=strait[2];
}else if(sam_atd_g[4]){
if(sam_atd_g[3]){
check_v=bend[1];
}
check_v=bend[0];
}else if(sam_atd_g[10]){
if(sam_atd_g[11]){
check_v=bend[1];
}
check_v=bend[0];
}else if(sam_atd_g[3]){
if(sam_atd_g[2]){
check_v=bend[2];
}
check_v=bend[1];
}else if(sam_atd_g[11]){
if(sam_atd_g[12]){
check_v=bend[2];
}
check_v=bend[1];
}else if(sam_atd_g[2]){
if(sam_atd_g[1]){
check_v=bend[3];
}
check_v=bend[2];
}else if(sam_atd_g[12]){
if(sam_atd_g[13]){
check_v=bend[3];
}
check_v=bend[2];
}else if(sam_atd_g[1]){
if(sam_atd_g[0]){
check_v=bend[4];
}
check_v=bend[3];
}else if(sam_atd_g[13]){
if(sam_atd_g[14]){
check_v=bend[4];
}
check_v=bend[3];
}else if(sam_atd_g[0]){
check_v=bend[4];
}else if(sam_atd_g[14]){
check_v=bend[4];
}
drive_flag=0;
}
*/
void crg_init(void)
{
SYNR=0x02; // mcu core 48MHz,(bus clock 24MHz) .
REFDV=0x01;
while((CRGFLG & 0x08)==0 ); // wait for PLL clock stabilization
CLKSEL |=0x80; // select PLL clock.
}
void pwm_init(void)
{
PWMCTL=0x10; // 通道01级联,7不级联
PWMPRCLK=0x33; // 设置A-clock和B-clock为24/8=3Mhz
PWMSCLB=0x26; //将SA和SB设置成为38Khz
PWMSCLA=0x26;
PWMPOL=0xA2; //起始电平设置为高电平
PWMCLK=0x80; // PWM01 select A_CLK,PWM7 select SB_CLK.
PWMCAE=0x7F; //设置01通道为中心对齐,7通道为左对齐
PWMCNT0=0x00; //将计数器清零
PWMCNT1=0x00;
PWMCNT7=0x00;
//PWMCNT1=0x00;
PWMPER01=0x7530; //设置01通道周期为20ms
PWMPER7=0xC3; //设置7通道的周期为5ms
//PWMPER1=0x4E;
PWMDTY7=0x01; //设置7通道的占空比为1%
//PWMDTY1=0x01;
PWMDTY01=2070; // 设置01通道的占空比为6.9% 则高电平对应时间为1.38ms
PWME=0x82; // 7通道和01通道使能
}
void atd_init(void)
{
ATD0CTL2=0xC0; //启动A/D转换
ATD1CTL2=0xC0; //当A/D转化结束后自动清除寄存器ATDSTAT1的CCFx位?
ATD0CTL3=0x02; //转换序列长度为8;
ATD1CTL3=0x02; //结果寄存器没有映射到转换序列;
ATD0CTL4=0x8A; //转换精度为8位;
ATD1CTL4=0x8A; //采样时间为2个A/D时钟周期;
ATD0CTL5=0xB0; //多通道A/D转换;
ATD1CTL5=0xB0; //连续A/D转换;
//转换结果无符号;
}//转换结果右对齐 存放在ATD0DRxL中;
//方向判断函数
void sam_position(void)
{
unsigned char i;
sam_atd_g[0]=ATD0DR0L; //These are the values of ATD0
sam_atd_g[1]=ATD0DR2L;
sam_atd_g[2]=ATD0DR3L;
sam_atd_g[3]=ATD0DR4L;
sam_atd_g[4]=ATD0DR5L;
sam_atd_g[5]=ATD0DR6L;
sam_atd_g[6]=ATD0DR7L; //These the values of ATD1
sam_atd_g[7]=ATD1DR0L;
sam_atd_g[8]=ATD1DR1L;
sam_atd_g[9]=ATD1DR2L;
sam_atd_g[10]=ATD1DR3L;
sam_atd_g[11]=ATD1DR4L;
sam_atd_g[12]=ATD1DR5L;
sam_atd_g[13]=ATD1DR6L;
sam_atd_g[14]=ATD1DR7L;
for(i=0;i<15;i++){
if(sam_atd_g[i]>ad_limit)
sam_atd_g[i]=1;
else sam_atd_g[i]=0;
}
}
void c_comp(void){
drive_flag=0;
if(sam_atd_g[7]){
if(sam_atd_g[6]){
front=13;
chang_f();
}
if(sam_atd_g[8]){
front=15;
chang_f();
}
front=14;
chang_f();
} else if(sam_atd_g[6]){
if(sam_atd_g[5]){
front=11;
chang_f();
check_bend();
}
front=12;
chang_f();
}else if(sam_atd_g[8]){
if(sam_atd_g[9]){
front=17;
chang_f();
check_bend();
}
front=16;
chang_f();
}else if(sam_atd_g[5]){
if(sam_atd_g[4]){
front=9;
chang_f();
check_bend();
}
front=10;
chang_f();
}else if(sam_atd_g[9]){
if(sam_atd_g[10]){
front=19;
chang_f();
check_bend();
}
front=18;
chang_f();
}else if(sam_atd_g[4]){
if(sam_atd_g[3]){
front=7;
chang_f();
check_bend();
}
front=8;
chang_f();
}else if(sam_atd_g[10]){
if(sam_atd_g[11]){
front=21;
chang_f();
check_bend();
}
front=20;
chang_f();
}else if(sam_atd_g[3]){
if(sam_atd_g[2]){
front=5;
chang_f();
check_bend();
}
front=6;
chang_f();
}else if(sam_atd_g[11]){
if(sam_atd_g[12]){
front=23;
chang_f();
check_bend();
}
front=22;
chang_f();
}else if(sam_atd_g[2]){
if(sam_atd_g[1]){
front=3;
chang_f();
check_bend();
}
front=4;
chang_f();
}else if(sam_atd_g[12]){
if(sam_atd_g[13]){
front=25;
chang_f();
check_bend();
}
front=24;
chang_f();
}else if(sam_atd_g[1]){
if(sam_atd_g[0]){
front=1;
chang_f();
check_bend();
}
front=2;
chang_f();
}else if(sam_atd_g[13]){
if(sam_atd_g[14]){
front=27;
chang_f();
check_bend();
}
front=26;
chang_f();
check_bend();
}else if(sam_atd_g[0]){
front=0;
chang_f();
check_bend();
}else if(sam_atd_g[14]){
front=28;
chang_f();
check_bend();
}
drive_flag=1;
}
void check_bend(void){ //检测弯道
bend_f++;
if(bend_f>200){
bend_f=0;
bend_flag=1;
}
}
void table_init(void){//the value of chuangganqi 不同区域的传感器给予不同的转向值,且赋值间隔逐渐递减.
int i;
int value=2070; // 小车转向中点时的赋值
for(i=14;i>=10;i--){//-6*15
table[i]=value;
value-=20;
}
value=1950;
for(i=9;i>=5;i--){ //-5*30
table[i]=value;
value-=40;
}
value=1750;
for(i=4;i>=0;i--){
table[i]=value;
value-=35;
}
value=2070;
for(i=14;i<=18;i++){ //+6*15
table[i]=value;
value+=20;
}
value=2190;
for(i=19;i<=23;i++){ //+5*30
table[i]=value;
value+=40;
}
value=2390;
for(i=24;i<=28;i++){
table[i]=value;
value+=35;
}
}
void chang_f(void){
if(front!=front1){
PWMDTY01=table[front];
front1=front;
}
}
void delay(void) {
unsigned int i;
for (i=0;i<65535;i++);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -