5.3无线调试模块设计
NRF24L01 是NORDIC 公司最近生产的一款无线通信通信芯片,采用FSK 调制,内部集成NORDIC 自己的Enhanced Short Burst 协议。可以实现点对 点或是1 对6 的无线通信。线通信速度可以达到2M(bps)。NORDIC 公司 提供通信模块的GERBER 文件,可以直接加工生产。嵌入式工程师或是单 片机爱好者只需要为单片机系统预留5 个GPIO,1 个中断输入引脚,就可以 很容易实现无线通信的功能,非常适合用来为MCU 系统构建无线通信功能。
同时,我也利用无线模块,设计出一个简易的遥控器。在平时调试过程中,遥控器对于保护车子起到了很重要的作用。以下是无线模块和遥控器图片:
21
第六章 模型车的主要技术参数
赛车基本参数 宽 高 车重 功耗 带载 电容总容量 传感器 CCD摄像头
光电编码器
1个
空载
大于4W 1700uF
1个
长
18.5cm 35cm 1200g
3W 28.5cm
除了车模原有的驱动电机、舵机之外伺服0 电机个数 赛道信息检测 精度(近/远) 频率
视野范围(近/远)
2/12.1mm 50Hz
5/130cm
结论
我们从认识、报名参加智能车,到自己动手编写程序、调整机械、焊接电路让车子跑起来,历时接近一年。这中间也花费了大量的精力、心思,也得到了学校、学院、老师和师兄们的支持,在此向他们表示感谢。
精彩激烈的赛区赛才刚刚落下帷幕,全国赛就已经吹响集结号。面对即将到来的大赛,也许我们的知识还不够丰富,考虑问题也不够全面,但是,我们小组也是经历过华南赛区赛的考验的,相信这一年来,我们的辛勤与付出,会让我们在比赛中收获到我们最美好的记忆。
22
参考文献
(1) 邵贝贝.单片机嵌入式应用的在线开发方法[M].北京.清华大学出版社.2004.
(2) 张军.AVR单片机应用系统开发典型实例.北京:中国电力出版社,2005. (3) 王晓明.电动机的单片机控制[M] .北京:北京航空航天大学出版社. 2002.
附录:程序源代码
void Speed_PID(int sv) {
EN2 = EN1; EN1 = EN0;
EN0 = sv - speed; //计算增量
dPWMN = (int)((Kp_DianJiN)*(float)(EN0 - EN1) + Ki_DianJiN*(float)(EN0) + Kd_DianJiN*(float)(EN0-2*EN1+EN2)); PWMN = dPWMN + SVN;
if(PWMN > 5000) //限幅 { PWMN = 5000; }
if(PWMN < 0) { PWMN = 0; }
FMotorPWM = 0; //反转 FTM1_C0V = PWMN; //正转 SVN = PWMN; }
23
#include \ /* common defines and macros */ #include \#include \#include \#include \#include \extern int speed;
extern int fmotorpwm;
//extern void itostr(int iNum,char str[]);
////////////////////////// dui de ///////////////////////////// //B口应该是 1001 1110 DDRB=0x9F
uchar TX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; unsigned char TxBuf[TX_PLOAD_WIDTH]={9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9};
unsigned char Buf[RX_PLOAD_WIDTH]={0}; unsigned char Buf1[RX_PLOAD_WIDTH]={0};
//uchar BUFFER[32][122];
uchar Tx[32];
uchar Car[32]=\ zhiyuzhishan smartcar ! \extern uchar spd[32]; //uchar flag=1; char test[32]={0};
//char *p_test = &test{0]; char count=0; char buf[32]={0}; char Rx_stop=1;
uchar
a=0,config=0,en_aa=0,en_rxaddr=0,setup_aw=0,setup_retr=0,rf_ch=0,rf_setup=0,status=0,observe_tx=0; uchar
cd=0,rx_addr_p0[RX_ADR_WIDTH],tx_addr[TX_ADR_WIDTH],rx_pw_p0[5],fifo_status=0;
void Delay_us(unsigned int n) {
for(;n>0;n--); for(;n>0;n--); for(;n>0;n--); for(;n>0;n--);
24
for(;n>0;n--); }
void Delay_ms(unsigned int n) {
for(;n>0;n--) {
Delay_us(7980); } }
//最基本的读函数
uchar SPI_RW(uchar byte) {
uchar bit_ctr;
for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit {
if(byte & 0x80) // output 'byte', MSB to MOSI MOSI_OUT=0;/// else
MOSI_OUT=1;///
byte = (byte << 1); // shift next bit into MSB.. SCK_OUT = 1; // Set SCK high..
byte |= MISO_IN; // capture current MISO bit SCK_OUT = 0; // ..then set SCK low again }
return(byte); // return read byte }
//寄存器 读 函数
uchar SPI_Read(uchar reg) {
uchar reg_val;
CSN_OUT = 0; // CSN low, initialize SPI communication... SPI_RW(reg); // Select register to read from.. reg_val = SPI_RW(0); // ..then read registervalue
CSN_OUT = 1; // CSN high, terminate SPI communication return(reg_val); // return register value }
//寄存器 批量读 函数
uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar bytes) {
uchar status,byte_ctr;
25