📄 小车.txt
字号:
//
//起跑位置识别
//能实现跑两圈停车的功能
#include <hidef.h> /* common defines and macros */
#include <mc9s12dg128.h> /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"
/*------------------------------------public variable----------------------------------------------------*/
unsigned char sam_atd_g[15]; //道路检测值
unsigned int adc_limit; //电压比较阀门值
unsigned int angle_data; //舵机转角
unsigned char car_speed; //车速控制
unsigned char dir_flag; //方向标志,为1表示检测到有效路径
unsigned char start_acc; //统计检测起跑线次数
unsigned char start_flag; //起跑线标志位,为1表示检测到起跑线3次
/*_____________________________________________________________________________________________________*/
void crg_init(void); // 锁相环初始化
void atd_init(void); // AD转换初始化
void pwm_init(void); // PWM信号初始化
void data_init(void);
void sam_position(void); //读adc结果
void check_direction(void); // 方向检测函数
void driver(void);
void delay(void);
void check_start(void); //起跑线检测函数
/*------------------------------------------MAIN---------------------------------------------------------*/
void main(void)
{
data_init(); //设置基本数据 比较电压值为51
crg_init(); //锁向环初始化
atd_init(); //初始化AD转化
pwm_init(); //初始化PWM
for(;;)
{
check_start();
sam_position();
check_direction();
driver();
}
}
//----------------------------data_init------------------------------
void data_init(void)
{
adc_limit=51;
start_acc=0;
start_flag=0;
}
/*-------------------------------------------CRG_INIT-----------------------------------------------------*/
void crg_init(void)
{
SYNR=0x02; // mcu core 48MHz,(bus clock 24MHz) .
REFDV=0x01;
while((CRGFLG & 0x08)==0 ); // wait for PLL clock stabilization
CLKSEL |=0x80; // select PLL clock.
}
/*-------------------------------------------PWM_INIT-----------------------------------------------------*/
void pwm_init(void)
{
PWMCTL=0x10; // 设置通道10级连;
PWME=0x82; // 通道7 and 1输出使能;
PWMPRCLK=0x72; // 预分频:B_CLK=A_CLK=busclk/2^2
PWMSCLA=0x01; //SA_CLK=A_CLK/(2*1)==3MHz
PWMSCLB=0X01; //SB_CLK=B_CLK/(2*1)==96KHz //
PWMPOL=0x02; //极性选择起始为高电平;
PWMCLK=0x82; // PWM01 选择 SA_CLK
// pwm7 选择 SB_CLK
PWMCNT0=0x00; //
PWMCNT1=0x00; //
PWMCNT7=0x00; //
PWMPER01=60000; // 周期==(1/3M)*(60000)=20ms;
PWMPER7= 192; // 周期==(1/96K)*(192)=2ms;
PWMCAE=0x00; //左对齐方式
}
/*--------------------------------------------ATD_INIT-------------------------------------------------*/
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 check_direction(void)
{
int i,j;
dir_flag=0;
for (i=0;i<15;i++) {
if((sam_atd_g[i]))
{
j=i-7;
angle_data=4500+j*200;
if (j>0)
car_speed=140-j*5;
else
car_speed=140+j*5;
dir_flag=1;
}
}
}
void check_start(void) {
unsigned char i,j=0;
for(i=0;i<14;i++){
if(sam_atd_g[i]^sam_atd_g[i+1]) j++;}
if(j>4) {start_acc++; delay();}
if (start_acc==3) start_flag=1;
}
/*--------------------------------------------control----------------------------------------------------*/
void driver(void){
PWMDTY01=angle_data;
if (start_flag==1)
PWME=0x00;
if (dir_flag==1)
PWMDTY7=car_speed;
else
PWMDTY7=0;
}
/*-------------------------------------------SAM_POSITION-----------------------------------------------*/
// the function is used for sampling the actual position of cruisecar.
// notice:
void sam_position(void)
{
unsigned char i;
sam_atd_g[0]=ATD0DR0L; //These are the values of ATD0
sam_atd_g[1]=ATD0DR2L;
sam_atd_g[2]=ATD0DR3L;
sam_atd_g[3]=ATD0DR4L;
sam_atd_g[4]=ATD0DR5L;
sam_atd_g[5]=ATD0DR6L;
sam_atd_g[6]=ATD0DR7L; //These the values of ATD1
sam_atd_g[7]=ATD1DR0L;
sam_atd_g[8]=ATD1DR1L;
sam_atd_g[9]=ATD1DR2L;
sam_atd_g[10]=ATD1DR3L;
sam_atd_g[11]=ATD1DR4L;
sam_atd_g[12]=ATD1DR5L;
sam_atd_g[13]=ATD1DR6L;
sam_atd_g[14]=ATD1DR7L;
for(i=0;i<15;i++){
if(sam_atd_g[i]>adc_limit)
sam_atd_g[i]=1;
else sam_atd_g[i]=0;
}
}
//---------------------------------------------delay-----------------------
void delay(void) {
unsigned int i;
for (i=0;i<65535;i++);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -