📄 main.c
字号:
#include <hidef.h> /* common defines and macros */
#include <mc9s12dg128.h> /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"
#pragma MESSAGE DISABLE C12056 /*消除代码优化带来的隐患*/
#include "main_asm.h" /* interface to the assembly module */
////////////////////////////////////////////////////////////////////good///////////////////////////
unsigned int mode=4;
unsigned int lastmode=4;
word speed;
unsigned int Sen_No[9]={0,0,0,0,0,0,0,0,0};
/*----------------------------------频率捕捉初始化------------------------------------------*/
void Init_ECT()
{
PACTL|=0x50; //用下降沿触发采集
}
/*-------------------------------------------------------------------------------------------*/
//必须用5V触发PT7,利用PT7作为脉冲捕捉端!!!!!!!!!!!!!!!!!
/*------------------------------------参数初始化----------------------------------------------*/
void Init_Parameter1()
{
PORTB=0X00;
DDRB=0Xff;//PORTB全为输出
PORTA=0X00;
DDRA=0X00;//PORTA都设为输入方式
// EnableInterrupts; //开中断
}
void Init_Parameter2()
{
PORTB=0X00;
DDRB=0X01;//PORTB除PORTB_BIT0为输出外,其余均设为输入方式
PORTA=0X00;
DDRA=0X00;//PORTA都设为输入方式
// EnableInterrupts; //开中断
}
/*-------------------------------------------------------------------------------------------*/
/*------------------------------------时钟初始化----------------------------------------------*/
void Init_Timer()
{
TCNT=0x00;
TSCR1 = 0x80; // 使能TCNT
TSCR2 = 0x00; // 开时钟中断,分频
}
/*--------------------------------------------------------------------------------------------*/
/*------------------------------------pwm初始化----------------------------------------------*/
static void PWM_Init()
{
PWME=0x91; //使用PWM0,PWM4(使用这两个是因为编程的时候高低位容易识别)
PWMPOL=0x81; //PWM0高电平起始,PWM4低电平起始(两者永远相反)
PWMCLK=0x91; //clock SA作为PWM0,PWM4的时钟源
PWMPRCLK=0x01; // clock A,B prescale : bus clock / 16 : 3MHz
PWMCAE=0x00; //PWM数据输出左对齐
PWMCTL=0x00; //PWM为独立的 8-bit PWM
PWMSCLA=0x02; //33886:Clock SA= Clock A / (2 * PWMSCLA)//500khz
PWMSCLB=0xFF; //33886:Clock SB= Clock B / (2 * PWMSCLB)//500khz 95
PWMPER0=0x80; //33886:PWM0 周期
// PWMx Period = Channel Clock Period * (2 * PWMPERx)
PWMPER4=0x80; //33886:PWM4 周期
// PWMx Period = Channel Clock Period * (2 * PWMPERx)
PWMDTY0=0x40; //PWM0 占空比
PWMDTY4=0x40; //PWM4 占空比
PWMPER6=0x94; //33886:PWM7 周期: 19ms
PWMPER7=0xFF; //33886:PWM7 周期: 19ms
// PWMx Period = Channel Clock Period * (2 * PWMPERx)
PWMDTY6=0x0B; //PWM7 占空比 1ms: 0x0D 2ms: 0x1B
PWMDTY7=0x14; //PWM7 占空比 1ms: 0x0D 2ms: 0x1B
}
/*--------------------------------------------------------------------------------------------*/
/*-----------------------------------舵机函数-------------------------------------------------*/
static void HDirection(int direc) {
PWMDTY7=-direc+0x16; //PWM7 占空比
} //十进制数,左转为+,右转为-,-6至+6之间
/*----------------------------------------------------------------------
----------------------*/
/*--------------------------------------------------------------------------------------------*/
/*-----------------------------------电机函数-------------------------------------------------*/
static void AMotor(int ASpeed) {
ASpeed=-ASpeed;
PWMDTY0=ASpeed+0x40; //PWM0 占空比
PWMDTY4=ASpeed+0x40; //PWM4 占空比
PORTB_BIT0=1;} //最小40速度
/*--------------------------------------------------------------------------------------------*/
/*------------------------------------延时1s小程序---------------------------------------------*/
void Delay_1s()
{
word counter1;
word counter2;
for(counter1=0;counter1<=65534;counter1++)
{
for(counter2=0;counter2<=14;counter2++)
{
asm{
nop //nop必须独占一行,不可与{}出现在同一行
}
}
}
}
/*-----------------------------------------------------------------------------------------------------*/
/*------------------------------------光电&编码测速 信息读取---------------------------------------------*/
void Sensor_RD() {
/*--------------------------信息读取---------------------------------------------*/
Sen_No[8]=PORTA_BIT7; //顺序从左-->右:8
Sen_No[7]=PORTA_BIT6; //顺序从左-->右:7
Sen_No[6]=PORTA_BIT5; //顺序从左-->右:6
Sen_No[5]=PORTA_BIT4; //顺序从左-->右:5
Sen_No[4]=PORTA_BIT3; //顺序从左-->右:4
Sen_No[3]=PORTA_BIT2; //顺序从左-->右: 3
//Sen_No[2]=PORTA_BIT1; //顺序从左-->右:2
Sen_No[2]=PORTA_BIT0; //顺序从左-->右:2
Sen_No[1]=PORTB_BIT1; //顺序从左-->右:1
//speed=PACN32; //编码器测速可以使用,待需要时加入
//PACN32=0;
}
/*-----------------------------------------------------------------------------------------------------*/
/*---------------------------------------决策函数--------------------------------------------------------*/
/**************************数据处理决策**************************************/
void Sensor_Decision() {
lastmode=mode;
if(Sen_No[4]==1&&Sen_No[5]==1&&Sen_No[3]==1)
mode=0; //直行,应当加速
else if(Sen_No[4]==1&&Sen_No[5]==1)
mode=1; //车右偏,直行无妨,适当减速
else if(Sen_No[4]==1&&Sen_No[3]==1)
mode=2; //车左偏,执行无妨,适当减速
else if(Sen_No[5]==1&&Sen_No[4]!=1&&Sen_No[6]!=1)
mode=3; //车右偏,但车头正,直行无妨,适当减速
else if(Sen_No[5]==1&&Sen_No[6]==1)
mode=4; //车右偏,舵机应当向左转5度
else if(Sen_No[3]==1&&Sen_No[4]!=1)
mode=5; //车左偏,但车头正,直行无妨,适当减速
else if(Sen_No[3]==1&&Sen_No[2]==1)
mode=6; //车左偏,舵机应当向右转5度
else if(Sen_No[6]==1&&Sen_No[7]!=1&&Sen_No[5]!=1)
mode=7; //尽管车头正,但车右偏严重,舵机应当左转10度
else if(Sen_No[6]==1&&Sen_No[7]==1)
mode=8; //舵机左转20度
else if(Sen_No[2]==1&&Sen_No[3]!=1&&Sen_No[1]!=1)
mode=9; //尽管车头正,但车左偏严重,舵机应当右转10度
else if(Sen_No[1]==1&&Sen_No[2]==1)
mode=10; //舵机右转20度
else if(Sen_No[7]==1&&Sen_No[8]!=1&&Sen_No[6]!=1)
mode=11; //舵机左转30度
else if(Sen_No[7]==1&&Sen_No[8]==1)
mode=12; //紧急减速,舵机左转40度
else if(Sen_No[1]==1&&Sen_No[2]!=1)
mode=13; //舵机右转30度
else if(Sen_No[8]==1&&Sen_No[7]!=1)
mode=14; //紧急减速,舵机右转40度
// else if(Sen_No[8]!=1&&Sen_No[7]!=1&&Sen_No[6]!=1&&Sen_No[5]!=1&&Sen_No[4]!=1&&Sen_No[3]!=1&&Sen_No[2]!=1&&Sen_No[1]!=1&&Sen_No[0]!=1)
// mode=15; //特殊情况,刹车,反转
else lastmode=mode;
switch(mode)
{
case 0: //中央
{ if(lastmode==0) //继续维持中央状态
{HDirection(0);
AMotor(43);}
else if(lastmode==1) //车右偏,直行无妨,适当减速
{HDirection(0);
AMotor(43);}
else if(lastmode==3) //车右偏,但车头正,直行无妨,适当减速
{ HDirection(0);
AMotor(43);
}
else if(lastmode==2) //车左偏,执行无妨,适当减速
{ HDirection(0);
AMotor(43); }
else if(lastmode==5) //车左偏,但车头正,直行无妨,适当减速
{ HDirection(0);
AMotor(43);
}
else {
lastmode=mode;
break;}}
case 1:
{ if(lastmode==1)
{HDirection(0);
AMotor(43);}
else if(lastmode==0)
{HDirection(0);
AMotor(43);}
else if(lastmode==3)
{ HDirection(0);
AMotor(43);
}
else if(lastmode==4){
HDirection(0);
AMotor(43);
}
else if(lastmode==2)
{ HDirection(0);
AMotor(43); }
else {
lastmode=mode;
break;}
}
case 2:
{ if(lastmode==2)
{HDirection(0);
AMotor(43);}
else if(lastmode==0)
{HDirection(0);
AMotor(43);}
else if(lastmode==1)
{ HDirection(0);
AMotor(43); }
else if(lastmode==5)
{ HDirection(0);
AMotor(43);
}
else if(lastmode==6){
HDirection(0);
AMotor(43);
}
else {
lastmode=mode;
break;}}
case 3:
{ if(lastmode==3)
{HDirection(0);
AMotor(43);}
else if(lastmode==4)
{ HDirection(1);
AMotor(43);
}
else if(lastmode==7)
{ HDirection(1);
AMotor(43);
}
else if(lastmode==1)
{HDirection(1);
AMotor(43);}
else if(lastmode==0)
{ HDirection(1);
AMotor(43); }
else {
lastmode=mode;
break;}}
case 4:
{ if(lastmode==4)
{HDirection(2);
AMotor(43);}
else if(lastmode==7)
{ HDirection(2);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -