📄 main.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 + -