1、外观介绍
2、优劣介绍
3、后续测评计划安排
1、外观介绍
拿到快递,从包装没说比较走心,包装精美硬核,能够在保护面包板的同时,还做得如此精美实在。
2、优劣介绍
板子做工精良,配备USB接口,方便开发调试,整个板子为整体黑色,可以判断板子的级别高于普通板子,另外留了足够的螺孔,目测3MM,因此算的上是考虑非常周到,但尚不理解开发商为何不配备USB线束,另外多数PIN均未焊接插针,也许是为了最大化方便用户DIY,另外包装中缺乏简要的说明,缺少短接头,整体来说非常不错。
3、后续测评计划安排
拿到板子已经8月21日了,时间比较紧迫,但是测评安排是在未来半年到一年内的安排,因本人工作与新能源科技公司从事电驱软件开发工作,因此我的测评将包含以下几个方面的内容:
1)电机控制及调速(PWM)
2)智能小车开发
3)智能小车避障
4)智能小车循迹
5)智能小车测距
因为工作原因可能更新较慢,望理解我先把之前基于其他板卡做的智能小车先发点图片给大家看看,有兴趣的朋友欢迎跟我联系,邮箱gaoj315@163.com。
《----------------------------源代码如下-------------------------------》
#define steer_kp 40
#define motor_kp 20
#define motor_ki 1000
#define ab(x,y) (x)>(y)?(x)-(y)y)-(x)
bool keys_GetBit(byte bitnum)
{
byte const Mask=keys_Table[bitnum];
return (PTT & Mask)==Mask;
}
void delay(unsigned int n)
{
int x,y;
for(x=0;x<n;x++)
{
for(y=0;y<n;y++);
}
}
void keyj(unsigned int n)
{
delay(400);
while(!keys_GetBit(n));
delay(400);
}
void Cpu_clock_Init(void)
{
CLKSEL=0;
PLLCTL=177;
SYNR =39;
REFDV =15;
PLLCTL =241;
while(!CRGFLG_LOCK);
CLKSEL=128;
}
void Delay100us(unsigned int n)
{
unsigned int i;
while(n--)
{
for(i=0;i<660;i++);
}
}
void SpiWriteByte(unsigned char dat)
{
unsigned char i=8;
while(i--)
{
SCK=0;
if(dat&0x80)
{
MISO=1;
MOSI=1;
}
else
{
MISO=0;
MOSI=0;
}
SCK=1;
dat<<=1;
}
}
void SpiWriteWord(unsigned int dat)
{
unsigned char i=16;
while(i--)
{
SCK=0;
if(dat&0x8000)
{
MISO=1;
MOSI=1;
}
else
{
MISO=0;
MOSI=0;
}
SCK=1;
dat<<=1;
}
}
void SpiWriteLong(unsigned long dat)
{
unsigned char i=32;
while(i--)
{
SCK=0;
if(dat&0x80000000)
{
MISO=1;
MOSI=1;
}
else
{
MISO=0;
MOSI=0;
}
SCK=1;
dat<<=1;
}
}
void Nrf2401Init(void)
{
unsigned char i;
POW_UP=1;
CS = 1;
Delay100us(40);
for(i=0; i<18; i++)
{
SpiWriteByte(Cofig);
}
CS = 0;
}
void TranData(byte n)
{
unsigned char i=0;
byte base=(n-1)*6;
CE = 1;
Delay100us(0);
for(i=0; i<4; i++)
{
SpiWriteByte(AddrCofig);
}
SpiWriteByte(n);
for(i=0;i<6;i++)
{
SpiWriteLong(save_s[base+i]);
}
SpiWriteByte(n);
CE = 0;
}
void TranData5(void)
{
unsigned char i;
CE=1;
Delay100us(0);
for(i=0;i<4;i++)
{
SpiWriteByte(AddrCofig);
}
SpiWriteByte(5);
SpiWriteByte(5);
CE=0;
}
void TranData6(void)
{
unsigned char i;
CE=1;
Delay100us(0);
for(i=0;i<4;i++)
{
SpiWriteByte(AddrCofig);
}
SpiWriteByte(6);
for(i=0;i<24;i++)
{
SpiWriteByte(path_s);
}
SpiWriteByte(6);
CE=0;
}
void hang_Enable(void)
{
PIFH=2;
PIEH_PIEH1=1;
}
void chang_Enable(void)
{
PIFH=1;
PIEH_PIEH0=1;
}
void dianji_picontrl(void)
{
ATD1CTL5=135;
while(!ATD1STAT0_SCF);
if((setspd==0)&&(actspd<5))
{
PWMDTY3=250;
}
else
{
spdcha=setspd-actspd;
if((motor_contrl!=0)&&(motor_contrl!=250))
motor_integral+=spdcha;
motor_contrl=125-spdcha*motor_kp-motor_integral/motor_ki;
if(motor_contrl<0) motor_contrl=0;
else if(motor_contrl>250) motor_contrl=250;
spddty=motor_contrl;
PWMDTY7=spddty;
PWMDTY3=spddty;
}
}
void duoji_pcontrl(void)
{
if(correct_count < 4)
ratiolong=7350+steer_kp*e/5;
else
ratiolong=7350+steer_kp*e/10;
if(ratiolong>=8350)
ratiolong=8350;
if(ratiolong<=6350)
ratiolong=6350;
ratio=ratiolong;
PWMDTY45=ratio;
}
void chuli(void)
{
unsigned int i;
for(i=0;i<64;i++)
{
if(color)
{
blacksegment[black_line_num].first=i;
blacksegment[black_line_num].num=0;
}
blacksegment[black_line_num-1].num++;
}
distans_min=64;
no_lineerr[chuli_count]=0;
for(i=0;i<black_line_num;i++)
{
blacknum_cha=(ab(blacksegment.num,lastblacknum));
if(blacknum_cha<blacknum_cha_range)
{
blacksegment.mid=blacksegment.first+blacksegment.num/2-31;
distan=(ab(lastblack,blacksegment.mid));
if(distan<distans_min)
{
distans_min=distan;
}
}
}
if(no_lineerr[chuli_count]==1)
{
err_type=0;
if(chuli_count<max_starthang)
{
if((path_blacksegment->order>1)&&(path_blacksegment->order<black_line_num))
{
left_blacksegment=path_blacksegment-1;
right_blacksegment=path_blacksegment+1;
startdis=right_blacksegment->first-left_blacksegment->first-left_blacksegment->num;
if(((ab(path_blacksegment->mid,0))<5)&&((ab(startdis,20))<10))
{
if(roundtime>25)
{
startnum++;
PORTB=~PORTB;
}
roundtime=0;
}
}
}
path[chuli_count]=path_blacksegment->mid;
path_x[chuli_count]=path[chuli_count]*shizhen[chuli_count];
lastblack=path_blacksegment->mid;
lastblacknum=path_blacksegment->num;
if(chuli_count==0)
{
lastblack_top=lastblack;
lastblacknum_top=lastblacknum;
}
hex+=path_x[chuli_count];
errcount=0;
}
}
void yasuo(void)
{
for(row=0;row<64;row+=2)
{
save_s[chuli_count]=(save_s[chuli_count]<<1)|(save[chuli_count][row]&save[chuli_count][row+1]);
}
}
void main(void)
{
Cpu_Init();
Nrf2401Init();
EnableInterrupts;
DDRB=0xff;
PORTB=0xff;
PWMDTY7=0;
PWMDTY3=250;
for(;;)
{
if(!keys_GetBit(1))
{
spd_base=30;
break;
}
if(!keys_GetBit(2))
{
spd_base=35;
break;
}
if(!keys_GetBit(3))
{
spd_base=40;
break;
}
if(!keys_GetBit(4))
{
spd_base=45;
break;
}
if(!keys_GetBit(5))
{
spd_base=50;
break;
}
}
setspd=spd_base;
for(;;)
{
if(startnum>=3)
{
stop=1;
hang_Disable();
PWMDTY45=7350;
if(roundtime>=20)
{
setspd=0;
chang_Disable();
}
}
else
{
if(chuli_count<caiji_count)
{
chuli();
if(chuli_count==24)
{
duoji_pcontrl();
save_data_tosend();
}
}
if(hang_count>send_hang[to_send])
{
TranData(to_send);
}
}
dianji_picontrl();
}
for(;;) {}
}
void chang (void)
{
PPSH_PPSH0=~PPSH_PPSH0;
roundtime++;
if(no_lineerr[0]==0)
err_stop++;
else
err_stop=0;
if(!stop)
{
to_send=0;
hang_count=0;
notwan=0;
hang_Enable();
}
}
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt 25 void Cpu__INT_PortH(void)
{
if(PIEH_PIEH0 && PIFH_PIFH0)
{
PIFH_PIFH0 = 1;
chang_OnInterrupt();
}
if(PIEH_PIEH1 && PIFH_PIFH1)
{
PIFH_PIFH1 = 1;
hang_OnInterrupt();
}
}
#pragma CODE_SEG DEFAULT