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

📄 main.c

📁 飞思卡尔比赛
💻 C
字号:
          #include <hidef.h>      /* common defines and macros */
#include <mc9s12dg128.h>     /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"
//数据段
#pragma DATA_SEG DEFAULT
volatile char flag_left=0;     //左传标志
volatile char flag_right=0;    //右转标志
volatile char flag_control=0;  //控制判断标志

#define kp 2 //比例系数
#define ki 0 //积分系数(暂定为0.5,实际上是除以2取整,每几个控制周期加一次积分)
#define kd 5 //微分系数

//signed int e_current=0;        //舵机偏离当前误差
#define  duoji_rightmax  1580        //舵机占空比控制
#define  duoji_leftmax   980
#define  duoji_mid    1280
int duoji_last=1280;
int duoji_current=1280;

#define  dianji_max 500// 550    //电机占空比控制(参数有带调整)
#define dianji_max1 450// 485
#define dianji_max2 410// 430
#define dianji_mid  350// 395
#define dianji_min  300// 360
#define dianji_serious 200// 320    //当小车脱离轨道的警戒速度
signed int dianji_add=0;               //速度可调部分
volatile signed int dianji_withback=0;
  //电机速度等于认为给定值+可调部分+反馈部分
int dianji_last=400;
int dianji_current=400;
signed char status[100];   //记录前100次道路左右弯方向

int speed_current=0;    //当前速度
int speed_ek=0;
int speed_ek_1=0;
int speed_ek_2=0;
char border_status[2];
char rpr_current[8];            //采集数据 
char rpr_last[8];    //采集的值
char road_status;
int road_i;

void speed_dianji(char);       //把速度转化成电机的占空比
void pid(void);                //PID调节
void dianji_adjust(void);      //电机速度调节
void duoji_adjust(void);       //舵机角度调节
char road_judge(int);
void roadput(int,byte);
void get_error(void);
void road_jilu(void);
void Test(void);
//延时程序
void timer_delay1(void)
{
   int i,j,m;
   for(i=0;i<5000;i++)
   {
     for(j=0;j<2000;j++)
     {
      m=0;
     }
   }
}

//减计数器中断处理函数
#pragma CODE_SEG NON_BANKED
void  interrupt  MDC_ISR(void ){
    //变量定义
    char speed_buffer1;
    MCFLG_MCZF=1; //清除中断标志
    //读取累加器值
    speed_buffer1=PACN1;
    PACN1=0;
    //time_circuit++;
    speed_dianji(speed_buffer1);
}            

#pragma CODE_SEG DEFAULT
void CRG_Init(void){
  PLLCTL=0xE1; //锁相环允许
  SYNR=0x02; //频率合成=2
  REFDV=0x01; //参考分频因子=1,总线频率=24MHz
  _asm(nop);
  _asm(nop);
  while(CRGFLG_LOCK!=1); //等待频率稳定
  CLKSEL=0x80; //选择锁相环时钟
}
void PORT_Init(void){
  DDRA=0x00; //PortA为输入口
  DDRH=0x00;      //H口接收数据
  DDRB=0xFF; //PortB为输出口
  PORTB=0xFF; //PortB所接的开发板上的LED全灭
  DDRT_DDRT0=0;   //ECT模块作T0为输入口 
  DDRT_DDRT4=1;   //ECT模块作T4为输出口 
  DDRT_DDRT5=1;   //ECT模块作T5为输输出口 
  PTT_PTT4=0;
  PTT_PTT5=1;
  
  
}
void MDC_Init(void){
  MCCTL=0xCF;//允许中断,强制重装初值,16分频
  MCCNT=0xEA60;//减计数器初值,时间为MCCNT*16/24US=40ms
}
/*正转初始化调用程序*/
void pwm6_ini() 
 {
   PWME_PWME6=0;      /*禁止PWM*/
   // PWMCTL_CON6=1;    /*16位PWM*/
   PWMCNT6=0;         /*计数器复值为0*/
   PWMCLK_PCLK6=1;    /*时钟源选择SB*/
   PWMPRCLK=0X00;     /*时钟预分频*/
   PWMSCLB=0X00;      /*时钟=24/2*/
   PWMPOL_PPOL6=1;      /*起始为1即为高*/
   PWMCAE_CAE6=0;      /*左对齐*/
   PWMPER6=0X73;       /*周期*/
   PWMDTY6=0X59;       /*占空比*/
   PWME_PWME6=1;         /*使能PWM*/
 }

 void pwm7_ini() 
 {
   PWME_PWME7=0;      /*禁止PWM*/
   // PWMCTL_CON6=1;    /*16位PWM*/
   PWMCNT7=0;         /*计数器复值为0*/
   PWMCLK_PCLK7=1;    /*时钟源选择SB*/
   PWMPRCLK=0X00;     /*时钟预分频*/
   PWMSCLB=0X00;      /*时钟=24/2*/
   PWMPOL_PPOL7=1;      /*起始为1即为高*/
   PWMCAE_CAE7=0;      /*左对齐*/
   PWMPER7=0X73;       /*周期*/
   PWMDTY7=0X59;       /*占空比*/
   PWME_PWME7=1;         /*使能PWM*/
 }
//舵机控制脉冲
void pwm01_ini(void) {
   PWME_PWME1=0;      /*禁止PWM*/
   PWMCTL_CON01=1;    /*16位PWM*/
   PWMCNT01=0;         /*计数器复值为0*/
   PWMCLK_PCLK1=1;    /*时钟源选择,选择SA*/
   PWMPRCLK=0X02;     /*时钟预分频/4*/
   PWMSCLA=0X03;      /*时钟=24/4/3/2=1US*/
   PWMPOL_PPOL1=1;      /*起始为1*/
   PWMCAE_CAE1=0;      /*左对齐*/
   PWMPER01=19800;       /*周期,*/
   PWMDTY01=1280; //占空比一个周期内应当计数2000次
   PWME_PWME1=1;        /*使能PWM*/
}  
void accumulator_ini(void)     //累加器计数测速度
{
    TIOS = 0x00;   //输入输出控制选择   
    TCTL4 = 0x08;  //上升沿选择 
    ICOVW_NOVW1 = 1;  // 保护 
    PACN1=0x0; 
    ICPAR_PA1EN = 1;  //脉冲累加器1进行使能
}


void duoji_adjust(void){
  
   PWMDTY01=duoji_current; //占空比
}

void dianji_adjust(void){
   int dianji_buffer=0;
   dianji_buffer=dianji_current+dianji_add+dianji_withback;
   if(dianji_buffer<dianji_min)  dianji_buffer=dianji_min;
   if(dianji_buffer>dianji_max) dianji_buffer=dianji_max;
   PWMDTY67=dianji_buffer; //占空比
}

void Test(void){
  PORTB=0x00;
  PORTB=0x33;//LED全亮再全灭作为测试,正式使用时删除  
}

void SystemInit(void) {
  int i=0;
  CRG_Init();
  PORT_Init();
  Test();
  timer_delay1();
  MDC_Init();
  pwm6_ini();
  pwm7_ini();
  pwm01_ini();
  accumulator_ini();
  for(i=0;i<100;i++){   //前100次状态初始化
    status[i]=0;
  }
  EnableInterrupts; 
  duoji_current=duoji_mid ;
  dianji_current=dianji_max;
  duoji_adjust();
  dianji_adjust();
}

void main(void) {
  SystemInit();
  PWMDTY6=0X10;
  PWMDTY7=0X00;
  for(;;) {
    
  } /* wait forever */
}

⌨️ 快捷键说明

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