久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 21779|回復(fù): 11
收起左側(cè)

DIY一輛智能電磁循跡小車(提供原理圖和PCB STM32程序)

  [復(fù)制鏈接]
ID:163153 發(fā)表于 2019-12-1 21:08 | 顯示全部樓層 |閱讀模式
近期為了迎接校賽,折騰了很久搞了一輛電磁循跡小車,現(xiàn)在決定將小車的資料開源。樓主目前還是小白,大佬勿噴,歡迎大家參考和下載。
59BDE612A05D376C54131C66CF55B42C.jpg

小車采用三輪車結(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)小毛病,建議大家修改一下。
862CC9F20BEFE594FD0B27B0A0BC6771.jpg



57C200C46D3C745CFFF759A56C4D63CC.jpg



IMG_20191105_165128.jpg

底盤是咸魚收的二手平衡小車之家底盤,然后自己找了2個(gè)42步進(jìn)電機(jī)。
3.jpg

原理圖和PCB大家可以參考參考,板載有集成2片TP4056X充電芯片,這樣可以方便充電,不至于每次都要取出來用專門的充電器充電。至于為什么要用2片TP4056X并聯(lián),是因?yàn)殡姵厝萘枯^大,單片TP4056X充電電流只有1A,充滿需要6小時(shí),實(shí)在是太久了。
D26C1PT575EF(}15{6((DTT.png



%C@A_TX[M2RHG~JGZ{JHKRO.png

前期時(shí)間比較趕,而且是抱著劃水的態(tài)度,程序比較Low,僅供參考。

單片機(jī)源程序如下:
  1. #include "led.h"
  2. #include "delay.h"
  3. #include "sys.h"
  4. #include "usart.h"
  5. #include "oled.h"
  6. #include "pwm.h"
  7. #include "key.h"
  8. #include "adc.h"
  9. #include "timer.h"
  10. #include "flash.h"

  11.         

  12. #define FLASH_START_ADDR  0x0801f000          //寫入的起始地址

  13. u8 t=0,flag=0,valu;
  14. u16 pwm=15000,adc_1,adc_2,adc_3,adc_4,adc_5,adc_6;
  15. void ADC_display();         //ADC采集界面
  16. void PWM_speed();                      //PWM參數(shù)
  17. void ADC_collection();                //ADC采集
  18. void MOTOR_different();         //步進(jìn)電機(jī)差速        
  19. void way();                 //尋跡
  20. int main(void)
  21. {        

  22.         delay_init();             //延時(shí)初始化
  23.         uart_init(9600);                 //串口初始化為9600
  24.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 設(shè)置中斷優(yōu)先級分組2
  25.          LED_Init();                                //初始化與LED連接的硬件接口
  26.         KEY_Init();
  27.         Adc_Init();                                  //ADC初始化
  28.         OLED_Init();                        //初始化OLED         
  29. //        pwm = FLASH_R(FLASH_START_ADDR);//從指定頁的地址讀FLASH
  30.          
  31.     TIM3_Int_Init(4999,7199);//10Khz的計(jì)數(shù)頻率,計(jì)數(shù)到5000為500ms  
  32.          
  33. //        TIM4_PWM_Init(pwm,0);//不分頻。PWM頻率=72000/(899+1)=80Khz
  34. //        TIM_SetCompare3(TIM4,pwm/2);            
  35. //        
  36. //        TIM5_PWM_Init(pwm,0);//不分頻。PWM頻率=72000/(899+1)=80Khz
  37. //        TIM_SetCompare2(TIM5,pwm/2);        
  38.          
  39.         DIR1=0;
  40.         ENA1=0;           //左輪
  41.         ENA2=0;
  42.         DIR2=1;    //右輪
  43.         
  44.         
  45.         
  46.          
  47.         OLED_Show_Font_16x16(0,00,8);
  48.         OLED_Show_Font_16x16(0+16,00,9);
  49.         OLED_Show_Font_16x16(0,16,10);
  50.         OLED_Show_Font_16x16(0+16,16,11);
  51.         OLED_Show_Font_16x16(0+32,16,12);   
  52.         OLED_Show_Font_16x16(0+48,16,13);        
  53.         OLED_ShowString(0+64,16,"......",16);  //系統(tǒng)初始化界面
  54.         OLED_Refresh_Gram();      //更新顯示到OLED
  55.         delay_ms(500);
  56.         for(valu=0;valu<128;valu++)                                  //加載系統(tǒng)讀條
  57.         {
  58.                 valu++;
  59.                 OLED_Fill(0,48,valu,64,1);   
  60.                 delay_ms(10);
  61.         }
  62.         

  63.                 while(1)
  64.                 {
  65.                         way();              //尋跡
  66.                         
  67.                 }

  68. }

  69. void ADC_display()
  70. {
  71.         
  72.         if(flag==0)
  73.         {
  74.                 OLED_Clear();       //清屏
  75.                 OLED_ShowString(5,0," ADC",24);  
  76.                 OLED_Show_Font_24x24(0+58,00,7);   
  77.                 OLED_Show_Font_24x24(0+80,00,8);                //顯示ADC采集 字樣
  78.                 OLED_ShowString(0,24,"CH1:       CH2:",12);  
  79.                 OLED_ShowString(0,38,"CH3:       CH4:",12);  
  80.                 OLED_ShowString(0,52,"CH5:       CH6:",12);  
  81.                 OLED_Refresh_Gram();      //更新顯示到OLED         
  82.                 flag=1;     //標(biāo)志位置1
  83.         }
  84.         
  85.         
  86. //        while(1)
  87. //        {
  88.                
  89.                 OLED_ShowNum(28,24, adc_1,4,12);    //ADC值
  90.                 OLED_ShowNum(100,24,adc_2,4,12);    //ADC值
  91.                 OLED_ShowNum(28,38, adc_3,4,12);    //ADC值
  92.                 OLED_ShowNum(100,38,adc_4,4,12);    //ADC值
  93.                 OLED_ShowNum(28,52, adc_5,4,12);    //ADC值
  94.                 OLED_ShowNum(100,52,adc_6,4,12);    //ADC值
  95.             OLED_Refresh_Gram();       //更新顯示到OLED
  96.                 LED0=!LED0;
  97.                
  98.                 t=KEY_Scan(0);
  99. //            if(t==KEY2_PRES)
  100. //                PWM_speed();
  101. //        }
  102.         
  103. }

  104. void PWM_speed()
  105. {
  106.         u16 a,r,p;
  107.         
  108.         OLED_Clear();        //清屏
  109.         OLED_ShowString(5,0," PWM",24);         
  110.         OLED_Show_Font_24x24(0+56,00,9);                        
  111.         OLED_Show_Font_24x24(0+80,00,10);                        //顯示PWM參數(shù) 字樣
  112.         OLED_ShowString(0,24, "PWM CCRx:",16);  
  113.         OLED_ShowString(0,40,"Pulse:       Hz",12);  
  114.         OLED_ShowString(0,52,"Speed:       r/min",12);  
  115.         
  116.         OLED_ShowNum(70,24,pwm,5,16);  //pwm CCRx值    恢復(fù)上一次退出前的值
  117.         OLED_ShowNum(40,40,p,5,12);    //脈沖速度
  118.         OLED_ShowNum(45,52,r,3,12);    //電機(jī)轉(zhuǎn)速
  119.         OLED_Refresh_Gram();       //更新顯示到OLED                 
  120.    

  121. //        while(1)
  122. //        {        

  123.    
  124.         t=KEY_Scan(0);                //得到鍵值
  125.                 switch(t)
  126.                 {                                 
  127.                         case KEY0_PRES:
  128.                                 pwm=pwm-500;   //6000-50000
  129.                                         if(pwm<=6000)
  130.                                                 pwm=6000;
  131.                                         p=(72000000/pwm);
  132.                                         r=((p*60)/3200);
  133.                                 TIM4_PWM_Init(pwm,0);
  134.                             TIM_SetCompare3(TIM4,pwm/2);
  135.                                 TIM5_PWM_Init(pwm,0);
  136.                             TIM_SetCompare2(TIM5,pwm/2);
  137.                                 OLED_ShowNum(70,24,pwm,5,16);  //pwm CCRx值
  138.                             OLED_ShowNum(40,40,p,5,12);    //脈沖速度
  139.                             OLED_ShowNum(45,52,r,3,12);    //電機(jī)轉(zhuǎn)速
  140.                             OLED_Refresh_Gram();  //更新顯示到OLED
  141.                         //        FLASH_W(FLASH_START_ADDR,pwm); //從指定頁的地址寫入FLASH
  142.                                 break;
  143.                         case KEY1_PRES:
  144.                                 pwm=pwm+500;
  145.                                         if(pwm>=50000)
  146.                                                 pwm=50000;
  147.                                         p=(72000000/pwm);
  148.                                         r=((p*60)/3200);
  149.                                 TIM4_PWM_Init(pwm,0);
  150.                             TIM_SetCompare3(TIM4,pwm/2);
  151.                                 TIM5_PWM_Init(pwm,0);
  152.                             TIM_SetCompare2(TIM5,pwm/2);
  153.                                 OLED_ShowNum(70,24,pwm,5,16);
  154.                             OLED_ShowNum(40,40,p,5,12);
  155.                             OLED_ShowNum(45,52,r,3,12);
  156.                                 OLED_Refresh_Gram();//更新顯示到OLED
  157.                         //        FLASH_W(FLASH_START_ADDR,pwm); //從指定頁的地址寫入FLASH
  158.                                 break;
  159.                         case KEY2_PRES:                                
  160.                                 ADC_display();
  161.                                 break;
  162.                         default:
  163.                                 delay_ms(10);        
  164. //                }
  165. //                OLED_ShowChar(36,52,t,12,1);//顯示ASCII字符        
  166. //                OLED_ShowNum(94,52,t,3,12);        //顯示ASCII字符的碼值   
  167. //                OLED_ShowNum(36,52,t,3,12);        //顯示ASCII字符的碼值   
  168. //                OLED_Refresh_Gram();//更新顯示到OLED

  169.         }         
  170. }

  171. void ADC_collection()
  172. {
  173.         adc_1=Get_Adc_Average(ADC_Channel_7,10);  //得到ADC采集值  CH7
  174.         adc_2=Get_Adc_Average(ADC_Channel_6,10);  //得到ADC采集值  CH6
  175.         adc_3=Get_Adc_Average(ADC_Channel_5,10);  //得到ADC采集值  CH5
  176.         adc_4=Get_Adc_Average(ADC_Channel_4,10);  //得到ADC采集值  CH4
  177.         adc_5=Get_Adc_Average(ADC_Channel_3,10);  //得到ADC采集值  CH3
  178.         adc_6=Get_Adc_Average(ADC_Channel_2,10);  //得到ADC采集值  CH2
  179. }

  180. void MOTOR_different()
  181. {
  182.         OLED_Show_Font_16x16(16,00,0);
  183.         OLED_Show_Font_16x16(16+16,00,1);
  184.         OLED_Show_Font_16x16(16+32,00,2);
  185.         OLED_Show_Font_16x16(16+48,00,3);
  186.         OLED_Show_Font_16x16(16+64,00,6);
  187.         OLED_Show_Font_16x16(16+80,00,7);
  188.                 while(1)
  189.                 {
  190.                         
  191.                 }
  192. }

  193. void way()
  194. {        
  195.         PWM_speed();
  196.         while(1)
  197.         {
  198.                 ADC_collection();      //ADC信號采集
  199.                 ADC_display();
  200.                
  201.                
  202.                 if(1500<adc_3 && adc_3<3000 && 1500<adc_4 && adc_4<3000)        //直行
  203.                 {
  204.                         if(ENA1==1)
  205.                         {
  206.                                 ENA1=0;           //左輪使能開啟
  207.                                 ENA2=0;           //右輪使能開啟
  208.                         }
  209.                                 TIM4_PWM_Init(pwm,0);
  210.                                 TIM_SetCompare3(TIM4,pwm/2);
  211.                                 TIM5_PWM_Init(pwm,0);
  212.                                 TIM_SetCompare2(TIM5,pwm/2);
  213.                                 
  214.                                 OLED_ShowString(116,0," ",24);
  215.                                 OLED_ShowString(116,0,"M",24);
  216.                                 OLED_Refresh_Gram();//更新顯示到OLED
  217.                
  218.                 }
  219.                
  220.                 if(2500<=adc_4 && adc_3<=2000)     //左轉(zhuǎn)彎
  221.                 {
  222.                         if(ENA1==1)
  223.                         {
  224.                                 ENA1=0;           //左輪使能開啟
  225.                                 ENA2=0;           //右輪使能開啟
  226.                         }
  227.                                 TIM4_PWM_Init(pwm,0);
  228.                                 TIM_SetCompare3(TIM4,pwm/2);
  229.                                 TIM5_PWM_Init(pwm/2,0);
  230.                                 TIM_SetCompare2(TIM5,pwm/4);
  231.                                 
  232.                                 OLED_ShowString(116,0," ",24);
  233.                                 OLED_ShowString(116,0,"L",24);
  234.                                 OLED_Refresh_Gram();//更新顯示到OLED
  235.                
  236.                 }
  237.                
  238.                 if(adc_4<2000 && 2500<adc_3)     //右轉(zhuǎn)彎
  239.                 {
  240.                         if(ENA1==1)
  241.                         {
  242.                                 ENA1=0;           //左輪使能開啟
  243.                                 ENA2=0;           //右輪使能開啟
  244.                         }               
  245.                                 TIM4_PWM_Init(pwm/2,0);
  246.                                 TIM_SetCompare3(TIM4,pwm/4);
  247.                                 TIM5_PWM_Init(pwm,0);
  248.                                 TIM_SetCompare2(TIM5,pwm/2);
  249.                                 
  250.                                 OLED_ShowString(116,0," ",24);
  251.                                 OLED_ShowString(116,0,"R",24);
  252.                                 OLED_Refresh_Gram();//更新顯示到OLED
  253.                
  254.                 }
  255.                
  256.                 if(adc_3<300 && adc_4<300)            //停止
  257.                 {
  258.                         if(ENA1==0)
  259.                         {
  260.                
  261.                                 ENA1=1;           //左輪使能關(guān)閉
  262.                                 ENA2=1;           //右輪使能關(guān)閉
  263.                                 
  264.                         }
  265.                         
  266.                         OLED_ShowString(116,0," ",24);
  267.                         OLED_ShowString(116,0,"S",24);
  268.                         OLED_Refresh_Gram();//更新顯示到OLED
  269.                         
  270.                         
  271.                 }
  272.                
  273. //                delay_ms(10);
  274.         }
  275.         
  276. }
復(fù)制代碼

51hei.png

全部資料51hei下載地址:
原理圖PCB.rar (18.35 MB, 下載次數(shù): 264)
程序.7z (211.78 KB, 下載次數(shù): 215)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵(lì)!

查看全部評分

回復(fù)

使用道具 舉報(bào)

ID:634487 發(fā)表于 2024-9-24 13:49 | 顯示全部樓層
設(shè)計(jì)非常強(qiáng)的
回復(fù)

使用道具 舉報(bào)

ID:1119398 發(fā)表于 2024-5-6 09:44 | 顯示全部樓層
想知道底盤大小還有電路板的尺寸大小
回復(fù)

使用道具 舉報(bào)

ID:1084042 發(fā)表于 2024-4-29 14:58 | 顯示全部樓層
帥同學(xué) 發(fā)表于 2021-3-31 10:09
同問,請問有電磁的bom表嘛

親親 有了嗎
回復(fù)

使用道具 舉報(bào)

ID:1084042 發(fā)表于 2024-4-29 14:57 | 顯示全部樓層
zzhh190807 發(fā)表于 2021-4-19 00:28
有傳感器的原理圖嗎

親親 有原理圖了嗎
回復(fù)

使用道具 舉報(bào)

ID:1097415 發(fā)表于 2023-10-28 12:35 | 顯示全部樓層
用的什么仿真軟件啊
回復(fù)

使用道具 舉報(bào)

ID:65066 發(fā)表于 2023-8-22 10:48 | 顯示全部樓層

謝謝樓主分享,下載學(xué)習(xí)了
回復(fù)

使用道具 舉報(bào)

ID:582255 發(fā)表于 2022-10-12 16:05 | 顯示全部樓層
請問那個(gè)AD采樣是干什么用的
回復(fù)

使用道具 舉報(bào)

ID:880210 發(fā)表于 2021-4-19 00:28 | 顯示全部樓層
有傳感器的原理圖嗎
回復(fù)

使用道具 舉報(bào)

ID:780742 發(fā)表于 2021-3-31 10:09 | 顯示全部樓層
同問,請問有電磁的bom表嘛
回復(fù)

使用道具 舉報(bào)

ID:590242 發(fā)表于 2020-6-9 21:22 | 顯示全部樓層
請問有電磁循跡模塊的bom表嗎
回復(fù)

使用道具 舉報(bào)

ID:526170 發(fā)表于 2020-5-3 00:14 | 顯示全部樓層
謝謝樓主分享
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日韩中文字幕在线观看 | 日韩精品久久久 | 日本一二三区在线观看 | 亚洲 中文 欧美 日韩 在线观看 | 国产精品美女久久久久久免费 | 91精品国产99| 国产成人99久久亚洲综合精品 | 亚洲成人一区 | 国产视频福利一区 | 老司机狠狠爱 | 在线观看日韩精品视频 | 欧美视频 | 国产农村妇女精品一二区 | 极品销魂美女一区二区 | 五月婷婷丁香婷婷 | 免费看爱爱视频 | www.日本国产| 欧美精品1区2区 | 成人av电影天堂 | 中文字幕视频在线观看 | 天堂久久天堂综合色 | 精品一二三 | 国产成人精品福利 | 羞羞视频免费观 | 国产我和子的乱视频网站 | 亚洲一区二区在线视频 | 在线播放日韩 | 亚洲精品视频一区 | 毛片免费在线 | 蜜桃久久 | 国产三级一区二区三区 | 欧美一区二区三区在线 | 欧美久久一区 | 99亚洲精品 | 国产亚洲精品精品国产亚洲综合 | 成人免费视频网站 | 精品毛片视频 | 成人美女免费网站视频 | 99精品视频免费观看 | 国产高清在线精品 | 成人影院一区二区三区 |