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