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

📄 main.c

📁 可用于舵机性能测试
💻 C
字号:
#include <hidef.h>      /* common defines and macros */
#include <mc9s12dg128.h>     /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"


#define atdenable ATD0CTL2_ADPU=1 //AD使能
#define pwmenable PWME=0xff     //PWM使能
#define paienable PACTL_PAEN=1  //PAI使能
#define timerenable TSCR1_TEN=1;    //定时器使能


const int  kp=134;         //比例系数
const int td=80;             //微分系数
signed int k1=1;
signed int t1=4;
signed char de;
unsigned int direction;    //
unsigned char signal;      //道路信息值
unsigned int sp;     //速度检测值
signed int speed;
unsigned int set_sp=0x01; //速度设定值
char set_sill[]={
  0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70
};//AD转换阀值
unsigned char pai; //速度检测完成标志
signed char e=0,e1=0,d1=0,d2=0,d3=0;    //位置偏移值
unsigned long y;
//clock setting,bus_clock=24mhz
void init_clock(void){
    REFDV=0x01;
    SYNR=0x02;
    while(CRGFLG_LOCK==0x00);
    CLKSEL_PLLSEL=1;
}

void init_portb(void){
  DDRB=0xff;
  PORTB=0xaa;
}


//ATD初始化
void init_atd(void){
  ATD0CTL2=0X00;//AD禁止,禁止中断,自动清除标志位
  ATD0CTL3=0X40;//8路转换
  ATD0CTL4=0X87;//8位精度,clk=1.5mhz,fs=750khz
  //ATD0CTL5=0XB0;//右对齐,多通道转换,连续转换
  ATD0CTL5=0x90;
}

//pwm init
 void init_pwm(void){
  PWME=0X00;
  PWMPRCLK=0X33;//clk=3mhz
  PWMPOL=0Xff;  //起始低电平
  PWMCAE=0X00;
  PWMCTL_CON01=1;
  PWMCTL_CON23=1;
  PWMCTL_CON45=1;
  PWMPER01=60000;//50hz
  PWMPER23=60000;
  PWMPER45=60000;
  PWMDTY01=4500;//1.5ms
  PWMDTY23=30000;
  PWMDTY45=10000;
}
//PAI init
void init_pai(void){
  PACTL=0x00;//PAI禁止,记数模式,中断关,下降沿捕捉
}

//定时器初始化,20ms中断
void init_timer(void){
  TSCR1=0X00;  //定时器禁止
  TIOS=0X80;   //TC7工作方式:输出比较
  TIE=0x80;    //TC7中断使能
  TSCR2=0X03;  //溢出中断禁止,置分频系数,f=3mhz
  TFLG1=0XFF;  //清除中断标志
  TC7=60000;   //TC7赋初值,f=50hz
  TCNT=0X0000;
}


unsigned int num[2]={6350,2050};
unsigned long m;
unsigned char n=0;
void ce(void){
  if(++n>1)
     n=0;
  PWMDTY01=num[n];
}

void main(void) {
  DisableInterrupts;
  init_clock();
  init_portb();
  init_atd();
  init_pwm();
  init_pai();
  init_timer();
  pai=120;
  EnableInterrupts;
  atdenable;
  pwmenable;
  paienable;
  timerenable;
  for(;;){
    ce();
    while(pai);
    pai=120;
  }
}
 //定时器中断服务程序
#pragma CODE_SEG NON_BANKED  //
void interrupt 15 tim(void){
   DisableInterrupts;
   pai--;
   sp=PACN32;
   PACN32=0x0000;
   TCNT=0X0000;
   TFLG1=0XFF;  //清除中断标志
   EnableInterrupts;
}

#pragma CODE_SEG DEAFULT_ROM 

⌨️ 快捷键说明

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