📄 主程序 .txt
字号:
#include <hidef.h> /* common defines and macros */
#include <mc9s12dg128.h> /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"
#include "main_asm.h" /* interface to the assembly module */
byte sam_atd_g[15]; //道路检测值
unsigned int table[29]; //方向表
byte front1; //转向值1
byte front; //转向值
unsigned int check_v;
unsigned int start_cnt;
unsigned int start_flag;
unsigned int drive_flag;
unsigned int strait[3];//直线各区域传感器所对应速度
unsigned int bend[5];//弯道各区域传感器所对应速度
#define adc_limit 153
void crg_init(void);
void atd_init(void);
void pwm_init(void);
void sam_position(void);
void table_init(void);
void chang_f(void);
void v_comp(void);
void c_comp(void);
void delay(void);
void check_start(void);
void check_stop(void);
void check_va(void);
void drive(void);
void main(void) {
crg_init();
atd_init();
pwm_init();
table_init();
check_va();
start_flag=1;
for(;;) {
check_start();
sam_position();
c_comp();
v_comp();
drive();
check_stop();
}
}
void check_start(void) {
int i=0,j=0;
for(i=0;i<14;i++){
if(sam_atd_g[i]^sam_atd_g[i+1]) j++;}
if(j>4) {start_cnt++; delay();}
if (start_cnt==3) start_flag=0;
}
void check_stop(void)
{
if (start_flag==0)
PWME=0x00;
}
void drive(void){
int i;
for(i=0;i<=14;i++){
if(sam_atd_g[i])
PWMDTY7=check_v;
else
PWMDTY7=0;
}
}
void crg_init(void){
SYNR=0x02; // mcu core clock 48MHz(bus clock 24MHz).
REFDV=0x01;
while((CRGFLG & 0x08)==0 ){ } // wait for PLL clock stabilization
CLKSEL |=0x80; // select PLL clock.
}
/*------------------------------------PWM_INIT-----------------------------------------
the function pwm_init() is used for preparing for the two motors work.
see port.h for details of pins connection.
-------------------------------------------------------------------------------------*/
void pwm_init(void)
{
PWMCTL=0x40; // 通道4,5级联,7和1不级联
PWMPRCLK=0x33; // 设置A-clock和B-clock为24/8=3Mhz
PWMSCLB=0x26; //
PWMSCLA=0x26;
PWMPOL=0xA2; // PWM45 select A_CLK,PWM7 select SB_CLK.
PWMCLK=0x80;
PWMCNT4=0x00;
PWMCNT5=0x00;
PWMCNT7=0x00;
PWMPER45=30000; // init_period(20ms)
PWMPER7=0xC3;
PWMCAE=0x7D;
PWMDTY7=0x01;
PWMDTY45=2070; // init_pulse(us)
PWME=0xA2; // for PWM7,PWM(4)5 output enable.
}
void atd_init(void)
{
ATD0CTL2=0xC0; //启动A/D转换
ATD1CTL2=0xC0; //当A/D转化结束后自动清除寄存器ATDSTAT1的CCFx位
ATD0CTL3=0x02; //转换序列长度为8;
ATD1CTL3=0x02; //结果寄存器没有映射到转换序列;
ATD0CTL4=0x8A; //转换精度为8位;
ATD1CTL4=0x8A; //采样时间为2个A/D时钟周期;
ATD0CTL5=0xB0; //多通道A/D转换;
ATD1CTL5=0xB0; //连续A/D转换;
//转换结果无符号;
} //转换结果右对齐 存放在ATD0DRxL中;
void sam_position(void)
{
unsigned char i;
sam_atd_g[0]=ATD0DR0L; //These are the values of ATD0
sam_atd_g[1]=ATD0DR1L;
sam_atd_g[2]=ATD0DR2L;
sam_atd_g[3]=ATD0DR3L;
sam_atd_g[4]=ATD0DR4L;
sam_atd_g[5]=ATD0DR5L;
sam_atd_g[6]=ATD0DR6L;
sam_atd_g[7]=ATD0DR7L;
sam_atd_g[8]=ATD1DR0L; //These the values of ATD1
sam_atd_g[9]=ATD1DR1L;
sam_atd_g[10]=ATD1DR2L;
sam_atd_g[11]=ATD1DR3L;
sam_atd_g[12]=ATD1DR4L;
sam_atd_g[13]=ATD1DR5L;
sam_atd_g[14]=ATD1DR6L;
for(i=0;i<15;i++){
if(sam_atd_g[i]>adc_limit)
sam_atd_g[i]=1;
else sam_atd_g[i]=0;
}
}
void c_comp(void){
drive_flag=0;
if(sam_atd_g[7]){
if(sam_atd_g[6]){
front=13;
chang_f();
}
if(sam_atd_g[8]){
front=15;
chang_f();
}
front=14;
chang_f();
} else if(sam_atd_g[6]){
if(sam_atd_g[5]){
front=11;
chang_f();
}
front=12;
chang_f();
}else if(sam_atd_g[8]){
if(sam_atd_g[9]){
front=17;
chang_f();
}
front=16;
chang_f();
}else if(sam_atd_g[5]){
if(sam_atd_g[4]){
front=9;
chang_f();
}
front=10;
chang_f();
}else if(sam_atd_g[9]){
if(sam_atd_g[10]){
front=19;
chang_f();
}
front=18;
chang_f();
}else if(sam_atd_g[4]){
if(sam_atd_g[3]){
front=7;
chang_f();
}
front=8;
chang_f();
}else if(sam_atd_g[10]){
if(sam_atd_g[11]){
front=21;
chang_f();
}
front=20;
chang_f();
}else if(sam_atd_g[3]){
if(sam_atd_g[2]){
front=5;
chang_f();
}
front=6;
chang_f();
}else if(sam_atd_g[11]){
if(sam_atd_g[12]){
front=23;
chang_f();
}
front=22;
chang_f();
}else if(sam_atd_g[2]){
if(sam_atd_g[1]){
front=3;
chang_f();
}
front=4;
chang_f();
}else if(sam_atd_g[12]){
if(sam_atd_g[13]){
front=25;
chang_f();
}
front=24;
chang_f();
}else if(sam_atd_g[1]){
if(sam_atd_g[0]){
front=1;
chang_f();
}
front=2;
chang_f();
}else if(sam_atd_g[13]){
if(sam_atd_g[14]){
front=27;
chang_f();
}
front=26;
chang_f();
}else if(sam_atd_g[0]){
front=0;
chang_f();
}else if(sam_atd_g[14]){
front=28;
chang_f();
}
drive_flag=1;
}
void chang_f(void){
if(front!=front1){
PWMDTY45=table[front];
front1=front;
}
}
void table_init(void){//the value of chuangganqi 不同区域的传感器给予不同的转向值,且赋值间隔逐渐递减.
int i;
int value=2070; // 小车转向中点时的赋值
for(i=14;i>=10;i--){//-6*15
table[i]=value;
value-=20;
}
value=1950;
for(i=9;i>=5;i--){ //-5*30
table[i]=value;
value-=40;
}
value=1750;
for(i=4;i>=0;i--){
table[i]=value;
value-=35;
}
value=2070;
for(i=14;i<=18;i++){ //+6*15
table[i]=value;
value+=20;
}
value=2190;
for(i=19;i<=23;i++){ //+5*30
table[i]=value;
value+=40;
}
value=2390;
for(i=24;i<=28;i++){
table[i]=value;
value+=35;
}
}
void check_va(void){
int i;
unsigned int value1;
value1=17;
for(i=0;i<=2;i++){
strait[i]=value1;
value1--;
}
for(i=0;i<=4;i++){
bend[i]=value1;
value1--;
}
}
void v_comp(void)
{
if(sam_atd_g[7]){
if(sam_atd_g[6]){
check_v=strait[0];
}
if(sam_atd_g[8]){
check_v=strait[0];
}
check_v=strait[0];
} else if(sam_atd_g[6]){
if(sam_atd_g[5]){
check_v=strait[1];
}
check_v=strait[1];
}else if(sam_atd_g[8]){
if(sam_atd_g[9]){
check_v=strait[1];
}
check_v=strait[1];
}else if(sam_atd_g[5]){
if(sam_atd_g[4]){
check_v=bend[0];
}
check_v=strait[2];
}else if(sam_atd_g[9]){
if(sam_atd_g[10]){
check_v=bend[0];
}
check_v=strait[2];
}else if(sam_atd_g[4]){
if(sam_atd_g[3]){
check_v=bend[1];
}
check_v=bend[0];
}else if(sam_atd_g[10]){
if(sam_atd_g[11]){
check_v=bend[1];
}
check_v=bend[0];
}else if(sam_atd_g[3]){
if(sam_atd_g[2]){
check_v=bend[2];
}
check_v=bend[1];
}else if(sam_atd_g[11]){
if(sam_atd_g[12]){
check_v=bend[2];
}
check_v=bend[1];
}else if(sam_atd_g[2]){
if(sam_atd_g[1]){
check_v=bend[3];
}
check_v=bend[2];
}else if(sam_atd_g[12]){
if(sam_atd_g[13]){
check_v=bend[3];
}
check_v=bend[2];
}else if(sam_atd_g[1]){
if(sam_atd_g[0]){
check_v=bend[4];
}
check_v=bend[3];
}else if(sam_atd_g[13]){
if(sam_atd_g[14]){
check_v=bend[4];
}
check_v=bend[3];
}else if(sam_atd_g[0]){
check_v=bend[4];
}else if(sam_atd_g[14]){
check_v=bend[4];
}
}
void delay(void) {
unsigned int i;
for (i=0;i<65535;i++);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -