📄 main.c
字号:
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
#pragma DATA_SEG DEFAULT
char left_sensor, right_sensor;
char left_temp[5], right_temp[5];
int i=0,j=0;
char dir=0,danger=0;
char speed_bk;
#pragma CODE_SEG DEFAULT
void PLL_INIT(void) //CPU总线时钟60M
{
REFDV=0x43;
SYNR=0xce;
POSTDIV=0x00; //bus period=16Mhz*(SYNR+1)/(REFDV+1)=60M
while(0==CRGFLG_LOCK); //wait for VCO to stablize
CLKSEL=0x80; //open PLL
}
void delay(int ms)
{
int i,j;
for(i=0;i<1000;i++)
for(j=0;j<60*ms;j++);
}
//////*****************ICO1输入捕捉******************************//////
void ECT_INIT(void)
{
//TSCR1=0X08;
TCTL4=0X04;//rising edeg only
TIE=0X02;//interrupt enable
TSCR2=0X02;//
TSCR1_TEN=1;//enable the timer
PACTL=0X40; //falling edge ,prescaler frequence,intterrupt enable
}
///////********************定时中断产生20ms一次的中断*****************///////
void PTI_INIT(void)
{
PITCE_PCE0=1;//chanel 0 enable
PITINTE_PINTE0=1;//interrupt enable;
PITMTLD0=60;
PITLD0=5000;//以上两句定义中断时间为:60*5000/60MHZ=5ms //1000
PITCFLMT_PITE=1;//PIT enable
}
/////*************************************************************/////
/////***AD采样程序,多通道采集,从0通道开始采样在采样1通道后返回*******
//*****************************************************************/////
/////*************************************************************/////
void ATD_INIT()
{ATD0CTL0=0X01;//wrap around after AN1;
ATD0CTL1=0X00;//8bit,no discharge,AN0 as external source
ATD0CTL2=0X62;//stop mode,fast clear,falling edge, interrupt enable
ATD0CTL3=0X90;//right DJ,continue convert under freeze mode,2conv per seq
ATD0CTL4=0X16;//4 clock,convert frequence=60M/(2*(5+1))=0.5M
ATD0CTL5=0X30;//start from AN0;
ATD0DIEN=0X00; //no digital buffer input
}
/*void ATD_INIT()
{ATD0CTL0=0X02;//wrap around after AN2;
ATD0CTL1=0X10;//10bit,no discharge,AN0 as external source
ATD0CTL2=0X62;//stop mode,fast clear,falling edge, interrupt enable
ATD0CTL3=0X98;//right DJ,continue convert under freeze mode,2conv per seq
ATD0CTL4=0X0a;//4 clock,convert frequence=40M/(2*(24+1))=0.5M
ATD0CTL5=0X30;//start from AN0;
ATD0DIEN=0X00; //no digital buffer input
} */
void PWM_INIT(void)
{
PWME=0X00;
PWMPOL=0XFF;
PWMCLK=0X80;//PP7 select SB as clock
PWMPRCLK=0X25;//clock A=60/64,clock B=60/4
PWMSCLB=0x05;//SB频率15M/2/5=1.5M
PWMCAE=0X00;
PWMCTL=0X00;
PWMCTL_CON67=1;
PWMPER67=30000; //T=20MS
PWMDTY67=1400;
PWMPER4=255;
PWMPER5=255;
PWMDTY4=0;
PWMDTY5=65;
PWME=0Xff;
}
/****************SCI初始化*************************/
void SCI_INIT(void)
{
SCI0BD=391;//60MHZ,9600BAUD
SCI0CR1=0X00;//8bit data,no parity,one start _bit,one stop_bit
SCI0CR2=0X20;
}
void sci_send(char ar)
{SCI0CR2_TE=1;
while(!SCI0SR1_TDRE);
SCI0DRL=ar;
SCI0CR2_TE=0;
}
/*****************************方向决策函数******************************/
void direction(void)
{
int diff;
if(left_sensor>right_sensor)
{
dir=0;//整车右偏
diff=left_sensor-right_sensor;
}
else
{
dir=1;//整车左偏
diff=right_sensor-left_sensor;
}
if(dir==0)
{
//if(diff<0X20&&right_sensor>0X70) PWMDTY67=1400-diff*3;
//else
{
if(right_sensor<0X50) PWMDTY67=950;
if(right_sensor>0X50&&right_sensor<0X60) PWMDTY67=980; //1000
if(right_sensor>0X60&&right_sensor<0X70) PWMDTY67=1150; //1150
if(right_sensor>0X70&&right_sensor<0X80) PWMDTY67=1250; //1250
if(right_sensor>0X80&&right_sensor<0X90) PWMDTY67=1350;
}
}
if(dir==1) //左偏
{
//if(diff<0X20&&left_sensor>0X70) PWMDTY67=1400+diff*3;
//else
{
if(left_sensor<0X50) PWMDTY67=1800;
if(left_sensor>0X50&&left_sensor<0X60) PWMDTY67=1780; //1750
if(left_sensor>0X60&&left_sensor<0X70) PWMDTY67=1680; //1680
if(left_sensor>0X70&&left_sensor<0X80) PWMDTY67=1550; //1550
if(left_sensor>0X80&&left_sensor<0X90) PWMDTY67=1450;
}
}
}
#pragma CODE_SEG NON_BANKED
#pragma TRAP_PROC
void interrupt 22 ATD(void)
{ left_temp[i]=ATD0DR0L>>2; //left sensor
right_temp[i]=ATD0DR1L>>2; //right sensor
//sci_send(left_temp[i]);
//sci_send(0xff);
//sci_send(right_temp[i]);
i++;
if(i==4)
{
left_sensor=left_temp[0]+left_temp[1]+left_temp[2]+left_temp[3];
right_sensor=right_temp[0]+right_temp[1]+right_temp[2]+right_temp[3];
//sci_send(0Xff);
sci_send(left_sensor);
sci_send(0Xff);
sci_send(right_sensor);
//sci_send(danger);
//sci_send(dir);
//sci_send(0Xff);
i=0;
}
ATD0STAT0_SCF=1;
}
////////////20ms时测试得到基本规律为:占空比增加10,速度反馈值增加2,良好线性/////////////////
void interrupt 66 PTI0(void)
{
PITTF_PTF0=1;
speed_bk=PACNTL;
//PORTB=PACNTL;
PACNT=0;
//sci_send(speed_bk);
}
#pragma CODE_SEG DEFAULT
void main(void) {
/* put your own code here */
PLL_INIT();
SCI_INIT();
ATD_INIT();
PWM_INIT();
ECT_INIT();
PTI_INIT();
DDRB=0XFF;
PORTB=0X0f;
//PWMDTY67=950; // 950 1400 1800
PWMDTY4=0;
PWMDTY5=0;
delay(200);
PWMDTY4=0;
PWMDTY5=115;
EnableInterrupts;
for(;;) {
direction();
//sci_send(0XFF);
_FEED_COP(); /* feeds the dog */
} /* loop forever */
/* please make sure that you never leave main */
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -