⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 一个用飞思卡尔16位单片机做的智能车程序
💻 C
字号:
#include <math.h>
#include <hidef.h>      /* common defines and macros */
#include <mc9s12dg128.h>     /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"

void ATD_init(void);
void GETATDVALUE(void);

void PWM_dir_init(void);
void PWM_motor_init(void);
void ADJUST_dir(char degree);
void ADJUST_speed(uchar pwmduty);
void port_init(void);

void TEST_speed(void);

uchar advalue[8];
uchar dirr[8]={0};
uchar admax,dir,speed,formspeed,flag,dirflag,yaokong,sum;
char P;


void main(void){  
    uchar i;
    port_init();    
    PWM_dir_init();
    PWM_motor_init();
    ATD_init();
    SCI0Init();
    ECT_Init();
    flag=0;
    dirflag=0;
    yaokong=0;
    speed=0;
    formspeed=200;
    PWMDTY3=68;
    dir=3;
    for(;;)
    {	
        //admax=0;
        GETATDVALUE();
        sum=0;
        for(i=0;i<8;i++)
        {
            dirr[i]=0;
            if(advalue[i]<0xa7)
            {
                dirr[i]=1;
                dir=i;
                sum=sum+dirr[i];
            }
        }
        if(sum>1)
        {
            if(dirr[3]==1||dirr[4]==1)
            {
                if(dirr[3]==1) dir=3;    
                if(dirr[4]==1) dir=4;     
            }
            if(dirr[2]==1||dirr[5]==1)
            {
                if(dirr[2]==1) dir=2;
                if(dirr[5]==1) dir=5;        
            }
            if(dirr[1]==1||dirr[6]==1)
            {
                if(dirr[1]==1) dir=1;
                if(dirr[6]==1) dir=6;        
            }
            if(dirr[0]==1||dirr[7]==1)
            {
                if(dirr[0]==1) dir=0;
                if(dirr[7]==1) dir=7;        
            }
        }
        PORTB=dir;
        
                if(dir==0) ADJUST_dir(-70);
                if(dir==7) ADJUST_dir(70); 
                if(dir==1) ADJUST_dir(-48);
                if(dir==6) ADJUST_dir(48);
                if(dir==2) ADJUST_dir(-30);
                if(dir==5) ADJUST_dir(30);
                if(dir==3) ADJUST_dir(-0);
                if(dir==4) ADJUST_dir(0); 
    }
}          



void port_init(void)
{
    DDRA=0X00;
    PORTA=0X00;
    DDRB=0XFF;
    PORTB=0X00;    
}      
void PWM_dir_init(void)
{
    PWMCTL_CON45=1;	        //4和5联合成16位PWM;
    PWMCAE_CAE5=0;					//选择输出模式为左对齐输出模式
    PWMCNT45=0;							//计数器清零;
    PWMPOL_PPOL5=1;					//正脉冲
    PWMPRCLK=0;             //clockA64分频;  clockA=busclock/64=8MHZ;  
    PWMSCLA=4;              //进行8分频;pwm clock=8M/8=1MHz;
    PWMPER45 = 20000;       //周期20ms; 50Hz; 
    PWMDTY45 = 1500;        //高电平时间为1.5ms;
    PWMCLK_PCLK5 = 1;       //选择clock SA做时钟源;
    PWME_PWME5 = 1;         //开启PWM
}

void PWM_motor_init(void){
    PWMCAE_CAE3=0;
    PWMCNT3=0;
    PWMPOL_PPOL3=1;
    PWMPRCLK=0;
    PWMSCLB=8;
    PWMPER3=200;
    PWMDTY3=0;
    PWMCLK_PCLK3=1;
    PWME_PWME3=1;
}

void ADJUST_dir(char degree)
{  
    PWMDTY45=(word)(degree+100)*5+1000; 
}
 
void ATD_init(void){             //ATD初始化
    ATD0CTL3=0X00;               //通道0作为AD采集通道
    ATD0CTL4=0X83;               //8位
    ATD0CTL5=0XB0;               //通道0连续采集
    ATD0DIEN=0X00;
    ATD0CTL2=0XC0;
    advalue[0]=0;
    advalue[1]=0;
    advalue[2]=0;
    advalue[3]=0;
    advalue[4]=0;
    advalue[5]=0;
    advalue[6]=0;
    advalue[7]=0;
}

void GETATDVALUE(void)
{	
    while(!ATD0STAT1_CCF0);
    advalue[0]=ATD0DR0L; 
    while(!ATD0STAT1_CCF1);
    advalue[1]=ATD0DR1L;
    while(!ATD0STAT1_CCF2);
    advalue[2]=ATD0DR2L;
    while(!ATD0STAT1_CCF3);
    advalue[3]=ATD0DR3L;
    while(!ATD0STAT1_CCF4);
    advalue[4]=ATD0DR4L;
    while(!ATD0STAT1_CCF5);
    advalue[5]=ATD0DR5L;
    while(!ATD0STAT1_CCF6);
    advalue[6]=ATD0DR6L;
    while(!ATD0STAT1_CCF7);
    advalue[7]=ATD0DR7L;
}
  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -