|
近期為了迎接校賽,折騰了很久搞了一輛電磁循跡小車,現(xiàn)在決定將小車的資料開源。樓主目前還是小白,大佬勿噴,歡迎大家參考和下載。
小車采用三輪車結(jié)構(gòu),前驅(qū),驅(qū)動部分為2個(gè)步進(jìn)電機(jī),驅(qū)動模塊是A4988,電源采用2節(jié)3000mAH的松下18650鋰電池,續(xù)航開源達(dá)到2-3小時(shí)。A4988模塊供電電壓為12V,所以板載集成了一個(gè)XL6009升壓電路,電壓升至12V,電源部分還有2個(gè)低壓LDO,提供5V和3.3V電源,分別共給電磁循跡模塊和單片機(jī)等等。XL6009升壓電路有點(diǎn)小毛病,建議大家修改一下。
底盤是咸魚收的二手平衡小車之家底盤,然后自己找了2個(gè)42步進(jìn)電機(jī)。
原理圖和PCB大家可以參考參考,板載有集成2片TP4056X充電芯片,這樣可以方便充電,不至于每次都要取出來用專門的充電器充電。至于為什么要用2片TP4056X并聯(lián),是因?yàn)殡姵厝萘枯^大,單片TP4056X充電電流只有1A,充滿需要6小時(shí),實(shí)在是太久了。
前期時(shí)間比較趕,而且是抱著劃水的態(tài)度,程序比較Low,僅供參考。
單片機(jī)源程序如下:- #include "led.h"
- #include "delay.h"
- #include "sys.h"
- #include "usart.h"
- #include "oled.h"
- #include "pwm.h"
- #include "key.h"
- #include "adc.h"
- #include "timer.h"
- #include "flash.h"
-
- #define FLASH_START_ADDR 0x0801f000 //寫入的起始地址
- u8 t=0,flag=0,valu;
- u16 pwm=15000,adc_1,adc_2,adc_3,adc_4,adc_5,adc_6;
- void ADC_display(); //ADC采集界面
- void PWM_speed(); //PWM參數(shù)
- void ADC_collection(); //ADC采集
- void MOTOR_different(); //步進(jìn)電機(jī)差速
- void way(); //尋跡
- int main(void)
- {
- delay_init(); //延時(shí)初始化
- uart_init(9600); //串口初始化為9600
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 設(shè)置中斷優(yōu)先級分組2
- LED_Init(); //初始化與LED連接的硬件接口
- KEY_Init();
- Adc_Init(); //ADC初始化
- OLED_Init(); //初始化OLED
- // pwm = FLASH_R(FLASH_START_ADDR);//從指定頁的地址讀FLASH
-
- TIM3_Int_Init(4999,7199);//10Khz的計(jì)數(shù)頻率,計(jì)數(shù)到5000為500ms
-
- // TIM4_PWM_Init(pwm,0);//不分頻。PWM頻率=72000/(899+1)=80Khz
- // TIM_SetCompare3(TIM4,pwm/2);
- //
- // TIM5_PWM_Init(pwm,0);//不分頻。PWM頻率=72000/(899+1)=80Khz
- // TIM_SetCompare2(TIM5,pwm/2);
-
- DIR1=0;
- ENA1=0; //左輪
- ENA2=0;
- DIR2=1; //右輪
-
-
-
-
- OLED_Show_Font_16x16(0,00,8);
- OLED_Show_Font_16x16(0+16,00,9);
- OLED_Show_Font_16x16(0,16,10);
- OLED_Show_Font_16x16(0+16,16,11);
- OLED_Show_Font_16x16(0+32,16,12);
- OLED_Show_Font_16x16(0+48,16,13);
- OLED_ShowString(0+64,16,"......",16); //系統(tǒng)初始化界面
- OLED_Refresh_Gram(); //更新顯示到OLED
- delay_ms(500);
- for(valu=0;valu<128;valu++) //加載系統(tǒng)讀條
- {
- valu++;
- OLED_Fill(0,48,valu,64,1);
- delay_ms(10);
- }
-
- while(1)
- {
- way(); //尋跡
-
- }
- }
- void ADC_display()
- {
-
- if(flag==0)
- {
- OLED_Clear(); //清屏
- OLED_ShowString(5,0," ADC",24);
- OLED_Show_Font_24x24(0+58,00,7);
- OLED_Show_Font_24x24(0+80,00,8); //顯示ADC采集 字樣
- OLED_ShowString(0,24,"CH1: CH2:",12);
- OLED_ShowString(0,38,"CH3: CH4:",12);
- OLED_ShowString(0,52,"CH5: CH6:",12);
- OLED_Refresh_Gram(); //更新顯示到OLED
- flag=1; //標(biāo)志位置1
- }
-
-
- // while(1)
- // {
-
- OLED_ShowNum(28,24, adc_1,4,12); //ADC值
- OLED_ShowNum(100,24,adc_2,4,12); //ADC值
- OLED_ShowNum(28,38, adc_3,4,12); //ADC值
- OLED_ShowNum(100,38,adc_4,4,12); //ADC值
- OLED_ShowNum(28,52, adc_5,4,12); //ADC值
- OLED_ShowNum(100,52,adc_6,4,12); //ADC值
- OLED_Refresh_Gram(); //更新顯示到OLED
- LED0=!LED0;
-
- t=KEY_Scan(0);
- // if(t==KEY2_PRES)
- // PWM_speed();
- // }
-
- }
- void PWM_speed()
- {
- u16 a,r,p;
-
- OLED_Clear(); //清屏
- OLED_ShowString(5,0," PWM",24);
- OLED_Show_Font_24x24(0+56,00,9);
- OLED_Show_Font_24x24(0+80,00,10); //顯示PWM參數(shù) 字樣
- OLED_ShowString(0,24, "PWM CCRx:",16);
- OLED_ShowString(0,40,"Pulse: Hz",12);
- OLED_ShowString(0,52,"Speed: r/min",12);
-
- OLED_ShowNum(70,24,pwm,5,16); //pwm CCRx值 恢復(fù)上一次退出前的值
- OLED_ShowNum(40,40,p,5,12); //脈沖速度
- OLED_ShowNum(45,52,r,3,12); //電機(jī)轉(zhuǎn)速
- OLED_Refresh_Gram(); //更新顯示到OLED
-
- // while(1)
- // {
-
- t=KEY_Scan(0); //得到鍵值
- switch(t)
- {
- case KEY0_PRES:
- pwm=pwm-500; //6000-50000
- if(pwm<=6000)
- pwm=6000;
- p=(72000000/pwm);
- r=((p*60)/3200);
- TIM4_PWM_Init(pwm,0);
- TIM_SetCompare3(TIM4,pwm/2);
- TIM5_PWM_Init(pwm,0);
- TIM_SetCompare2(TIM5,pwm/2);
- OLED_ShowNum(70,24,pwm,5,16); //pwm CCRx值
- OLED_ShowNum(40,40,p,5,12); //脈沖速度
- OLED_ShowNum(45,52,r,3,12); //電機(jī)轉(zhuǎn)速
- OLED_Refresh_Gram(); //更新顯示到OLED
- // FLASH_W(FLASH_START_ADDR,pwm); //從指定頁的地址寫入FLASH
- break;
- case KEY1_PRES:
- pwm=pwm+500;
- if(pwm>=50000)
- pwm=50000;
- p=(72000000/pwm);
- r=((p*60)/3200);
- TIM4_PWM_Init(pwm,0);
- TIM_SetCompare3(TIM4,pwm/2);
- TIM5_PWM_Init(pwm,0);
- TIM_SetCompare2(TIM5,pwm/2);
- OLED_ShowNum(70,24,pwm,5,16);
- OLED_ShowNum(40,40,p,5,12);
- OLED_ShowNum(45,52,r,3,12);
- OLED_Refresh_Gram();//更新顯示到OLED
- // FLASH_W(FLASH_START_ADDR,pwm); //從指定頁的地址寫入FLASH
- break;
- case KEY2_PRES:
- ADC_display();
- break;
- default:
- delay_ms(10);
- // }
- // OLED_ShowChar(36,52,t,12,1);//顯示ASCII字符
- // OLED_ShowNum(94,52,t,3,12); //顯示ASCII字符的碼值
- // OLED_ShowNum(36,52,t,3,12); //顯示ASCII字符的碼值
- // OLED_Refresh_Gram();//更新顯示到OLED
- }
- }
- void ADC_collection()
- {
- adc_1=Get_Adc_Average(ADC_Channel_7,10); //得到ADC采集值 CH7
- adc_2=Get_Adc_Average(ADC_Channel_6,10); //得到ADC采集值 CH6
- adc_3=Get_Adc_Average(ADC_Channel_5,10); //得到ADC采集值 CH5
- adc_4=Get_Adc_Average(ADC_Channel_4,10); //得到ADC采集值 CH4
- adc_5=Get_Adc_Average(ADC_Channel_3,10); //得到ADC采集值 CH3
- adc_6=Get_Adc_Average(ADC_Channel_2,10); //得到ADC采集值 CH2
- }
- void MOTOR_different()
- {
- OLED_Show_Font_16x16(16,00,0);
- OLED_Show_Font_16x16(16+16,00,1);
- OLED_Show_Font_16x16(16+32,00,2);
- OLED_Show_Font_16x16(16+48,00,3);
- OLED_Show_Font_16x16(16+64,00,6);
- OLED_Show_Font_16x16(16+80,00,7);
- while(1)
- {
-
- }
- }
- void way()
- {
- PWM_speed();
- while(1)
- {
- ADC_collection(); //ADC信號采集
- ADC_display();
-
-
- if(1500<adc_3 && adc_3<3000 && 1500<adc_4 && adc_4<3000) //直行
- {
- if(ENA1==1)
- {
- ENA1=0; //左輪使能開啟
- ENA2=0; //右輪使能開啟
- }
- TIM4_PWM_Init(pwm,0);
- TIM_SetCompare3(TIM4,pwm/2);
- TIM5_PWM_Init(pwm,0);
- TIM_SetCompare2(TIM5,pwm/2);
-
- OLED_ShowString(116,0," ",24);
- OLED_ShowString(116,0,"M",24);
- OLED_Refresh_Gram();//更新顯示到OLED
-
- }
-
- if(2500<=adc_4 && adc_3<=2000) //左轉(zhuǎn)彎
- {
- if(ENA1==1)
- {
- ENA1=0; //左輪使能開啟
- ENA2=0; //右輪使能開啟
- }
- TIM4_PWM_Init(pwm,0);
- TIM_SetCompare3(TIM4,pwm/2);
- TIM5_PWM_Init(pwm/2,0);
- TIM_SetCompare2(TIM5,pwm/4);
-
- OLED_ShowString(116,0," ",24);
- OLED_ShowString(116,0,"L",24);
- OLED_Refresh_Gram();//更新顯示到OLED
-
- }
-
- if(adc_4<2000 && 2500<adc_3) //右轉(zhuǎn)彎
- {
- if(ENA1==1)
- {
- ENA1=0; //左輪使能開啟
- ENA2=0; //右輪使能開啟
- }
- TIM4_PWM_Init(pwm/2,0);
- TIM_SetCompare3(TIM4,pwm/4);
- TIM5_PWM_Init(pwm,0);
- TIM_SetCompare2(TIM5,pwm/2);
-
- OLED_ShowString(116,0," ",24);
- OLED_ShowString(116,0,"R",24);
- OLED_Refresh_Gram();//更新顯示到OLED
-
- }
-
- if(adc_3<300 && adc_4<300) //停止
- {
- if(ENA1==0)
- {
-
- ENA1=1; //左輪使能關(guān)閉
- ENA2=1; //右輪使能關(guān)閉
-
- }
-
- OLED_ShowString(116,0," ",24);
- OLED_ShowString(116,0,"S",24);
- OLED_Refresh_Gram();//更新顯示到OLED
-
-
- }
-
- // delay_ms(10);
- }
-
- }
復(fù)制代碼
全部資料51hei下載地址:
原理圖PCB.rar
(18.35 MB, 下載次數(shù): 264)
2019-12-1 21:07 上傳
點(diǎn)擊文件名下載附件
程序.7z
(211.78 KB, 下載次數(shù): 215)
2019-12-2 11:54 上傳
點(diǎn)擊文件名下載附件
|
評分
-
查看全部評分
|