找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 6453|回復(fù): 9
打印 上一主題 下一主題
收起左側(cè)

STM32雙路避障小車制作 附源程序仿真電路圖

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:644357 發(fā)表于 2020-11-17 20:21 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
材料清單:
    1供電:12V航模電池,12V~5V轉(zhuǎn)電壓模塊,開(kāi)關(guān)*1
    2控制:STM32C8T6最小系統(tǒng)板,紅外避障模塊*2
    3驅(qū)動(dòng):L298N驅(qū)動(dòng)模塊*2
    4對(duì)象:電機(jī)*4的小車
注:紅色部分不可缺。


放實(shí)物圖
   

線路連接圖

  

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


(避障模塊沒(méi)有放進(jìn)去因?yàn)槭堑碗娖接|發(fā),兩個(gè)避障模塊接B0,B1口)


STM32單片機(jī)源程序文件:
  1. #include "ALLhander.h"

  2. int main(void)
  3. {        

  4.          
  5.          
  6.     LED_Config();
  7.           Motor_enable_Init();
  8.           Motor_PWM_control_GPIO_Config();
  9.       Tim3_mode_Config(T_Period,T_PSC,200);
  10.           Total_NVIC_interrupt_config();
  11.          
  12.           Obstacle_avoidance();

  13.    while(1)
  14.          {
  15. //                 
  16.                    straight();
  17.                  
  18.        Systick_Delay_ms(1000);
  19.       }
  20. }
復(fù)制代碼
L298N配置文件
  1. #include "L298N_GPIO.h"
  2. #include "systick.h"


  3. void LED_Config(void)
  4. {
  5.         GPIO_InitTypeDef  GPIO_InitStruct;
  6.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
  7.         
  8.         //LED指示燈
  9.         GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;                                 
  10.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;                  
  11.         GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  12.         
  13.         GPIO_Init(GPIOC, &GPIO_InitStruct);                                                  
  14. }


  15. void Front_Motor_enzble_control(void)
  16. {
  17.         GPIO_InitTypeDef  GPIO_InitStructure;
  18.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
  19.         GPIO_InitStructure.GPIO_Pin = Motor1_cw_Pin|Motor1_ccw_Pin|Motor2_cw_Pin|Motor2_ccw_Pin;
  20.         GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP;
  21.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  22.         GPIO_Init(GPIOA,&GPIO_InitStructure);
  23. }
  24. void Back_Motor_enzble_control(void)
  25. {
  26.         GPIO_InitTypeDef  GPIO_InitStructure;
  27.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
  28.         GPIO_InitStructure.GPIO_Pin = Motor3_cw_Pin|Motor3_ccw_Pin|Motor4_cw_Pin|Motor4_ccw_Pin;
  29.         GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP;
  30.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  31.         GPIO_Init(GPIOB,&GPIO_InitStructure);
  32. }

  33. void Motor_enable_Init(void)
  34. {
  35.         Front_Motor_enzble_control();
  36.         Back_Motor_enzble_control();
  37. }

  38. void Motor_PWM_control_GPIO_Config(void)
  39. {
  40.         GPIO_InitTypeDef  GPIO_InitStructure;
  41.         
  42.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
  43.         //RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
  44.         //GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);
  45.         
  46.         GPIO_InitStructure.GPIO_Pin = Speed_control_Pin;
  47.         GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF_PP;
  48.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  49.         
  50.         GPIO_Init(Speed_control_Port,&GPIO_InitStructure);
  51. }

  52. void Tim3_mode_Config(uint16_t period,uint16_t Prescaler,uint16_t Pulse)
  53. {
  54.                   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  55.            TIM_OCInitTypeDef TIM_OCInitStructure;
  56.          
  57.          
  58.          //開(kāi)啟定時(shí)器3的時(shí)鐘
  59.          RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
  60.          
  61.          //TIM3重映射
  62.          GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);
  63.          
  64.          // 自動(dòng)重裝載寄存器的值,累計(jì)TIM_Period+1個(gè)頻率后產(chǎn)生一個(gè)更新或者中斷
  65.         TIM_TimeBaseStructure.TIM_Period = period;        
  66.          
  67.         // 驅(qū)動(dòng)CNT計(jì)數(shù)器的時(shí)鐘 = Fck_int/(psc+1)
  68.         TIM_TimeBaseStructure.TIM_Prescaler = Prescaler;
  69.          
  70.          //時(shí)鐘分割
  71.         TIM_TimeBaseStructure.TIM_ClockDivision = 0;  
  72.          
  73. //        // 時(shí)鐘分頻因子 ,配置死區(qū)時(shí)間時(shí)需要用到
  74. //        TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;               

  75.         // 計(jì)數(shù)器計(jì)數(shù)模式,設(shè)置為向上計(jì)數(shù)
  76.         TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;               
  77.         // 重復(fù)計(jì)數(shù)器的值,沒(méi)用到不用管
  78.         //TIM_TimeBaseStructure.TIM_RepetitionCounter=0;        
  79.         
  80.         // 初始化定時(shí)器
  81.         TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

  82.          
  83.          
  84.         // 配置為PWM模式1
  85.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
  86.         
  87.         // 輸出使能
  88.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  89.         // 互補(bǔ)輸出使能
  90.         //TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
  91.         
  92.         
  93.         // 設(shè)置脈沖寬度 CRR的值,0-65535
  94.         TIM_OCInitStructure.TIM_Pulse = Pulse;
  95.         
  96.         // 輸出通道電平極性配置
  97.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  98.         // 互補(bǔ)輸出通道電平極性配置
  99.         //TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
  100.         
  101.         // 輸出通道空閑電平極性配置
  102.         //TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
  103.         // 互補(bǔ)輸出通道空閑電平極性配置
  104.         //TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
  105.         
  106. //  TIM_OC1Init(TIM3, &TIM_OCInitStructure);        
  107. //        TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);


  108.         TIM_OC1Init(TIM3, &TIM_OCInitStructure);
  109.         TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
  110. //        TIM_OC3Init(TIM2, &TIM_OCInitStructure);
  111. //        TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);
  112. //        TIM_OC4Init(TIM2, &TIM_OCInitStructure);
  113. //        TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);
  114.         
  115.         TIM_Cmd(TIM3, ENABLE);        
  116.         // 主輸出使能,當(dāng)使用的是通用定時(shí)器時(shí),這句不需要
  117.         //TIM_CtrlPWMOutputs(ADVANCE_TIM, ENABLE);
  118. }

  119. //電機(jī)1
  120. void Motor1_CW(void)   
  121. {
  122.      GPIO_ResetBits(GPIOA,Motor1_ccw_Pin);
  123.      GPIO_SetBits(GPIOA,Motor1_cw_Pin);
  124. }
  125. void Motor1_CCW(void)  
  126. {
  127.      GPIO_ResetBits(GPIOA,Motor1_cw_Pin);
  128.      GPIO_SetBits(GPIOA,Motor1_ccw_Pin);
  129. }
  130. //電機(jī)2
  131. void Motor2_CW(void)   
  132. {
  133.      GPIO_ResetBits(GPIOA,Motor2_ccw_Pin);
  134.      GPIO_SetBits(GPIOA,Motor2_cw_Pin);
  135. }
  136. void Motor2_CCW(void)  
  137. {
  138.      GPIO_ResetBits(GPIOA,Motor2_cw_Pin);
  139.      GPIO_SetBits(GPIOA,Motor2_ccw_Pin);
  140. }
  141. //電機(jī)3
  142. void Motor3_CW(void)   
  143. {
  144.      GPIO_ResetBits(GPIOB,Motor3_ccw_Pin);
  145.      GPIO_SetBits(GPIOB,Motor3_cw_Pin);
  146. }
  147. void Motor3_CCW(void)  
  148. {
  149.      GPIO_ResetBits(GPIOB,Motor3_cw_Pin);
  150.      GPIO_SetBits(GPIOB,Motor3_ccw_Pin);
  151. }
  152. //電機(jī)4
  153. void Motor4_CW(void)   
  154. {
  155.      GPIO_ResetBits(GPIOB,Motor4_ccw_Pin);
  156.      GPIO_SetBits(GPIOB,Motor4_cw_Pin);
  157. }
  158. void Motor4_CCW(void)  
  159. {
  160.      GPIO_ResetBits(GPIOB,Motor4_cw_Pin);
  161.      GPIO_SetBits(GPIOB,Motor4_ccw_Pin);
  162. }


  163. void straight(void)
  164. {
  165.   
  166.   Motor1_CW();
  167.   Motor2_CW();
  168.   Motor3_CW();
  169.   Motor4_CW();
  170. }
  171. void Turn_left(void)
  172. {
  173.         
  174.         Motor1_CCW();
  175.         Motor2_CW();
  176.         Motor3_CCW();
  177.         Motor4_CW();
  178.         
  179. }
  180. void Turn_left_move(void)
  181. {
  182.         
  183.         Motor1_CCW();
  184.         Motor2_CW();
  185.         Motor3_CW();
  186.         Motor4_CCW();
  187.         
  188. }
  189. void Turn_right(void)
  190. {
  191.         
  192.         Motor1_CW();
  193.         Motor2_CCW();
  194.         Motor3_CW();
  195.         Motor4_CCW();
  196.         
  197. }
  198. void Turn_right_move(void)
  199. {
  200.         
  201.         Motor1_CW();
  202.         Motor2_CCW();
  203.         Motor3_CCW();
  204.         Motor4_CW();
  205.         
  206. }
  207. void Back(void)
  208. {
  209.         
  210.         Motor1_CCW();
  211.         Motor2_CCW();
  212.         Motor3_CCW();
  213.         Motor4_CCW();
  214. }
  215. void Stop_motor1(void)
  216. {
  217.     GPIO_ResetBits(GPIOA,Motor1_cw_Pin);
  218.         GPIO_ResetBits(GPIOA,Motor1_ccw_Pin);
  219. }
  220. void Stop_motor2(void)
  221. {
  222.     GPIO_ResetBits(GPIOA,Motor2_cw_Pin);
  223.         GPIO_ResetBits(GPIOA,Motor2_ccw_Pin);
  224. }
  225. void Stop_motor3(void)
  226. {
  227.     GPIO_ResetBits(GPIOB,Motor3_cw_Pin);
  228.         GPIO_ResetBits(GPIOB,Motor3_ccw_Pin);
  229.         Systick_Delay_ms(300);
  230. }
  231. void Stop_motor4(void)
  232. {
  233.     GPIO_ResetBits(GPIOB,Motor4_cw_Pin);
  234.         GPIO_ResetBits(GPIOB,Motor4_ccw_Pin);
  235. }
復(fù)制代碼
中斷服務(wù)函數(shù)
  1. void Left_spinner_IRQHandler(void)
  2. {
  3.         if(EXTI_GetITStatus(EXTI_Line1) !=RESET)
  4.         {
  5.         Back();
  6.         Systick_Delay_ms(300);
  7.         Turn_right();
  8.         Systick_Delay_ms(200);
  9.         straight();
  10.         EXTI_ClearITPendingBit(EXTI_Line1);
  11.         }

  12. }
  13. void right_spinner_IRQHandler(void)
  14. {
  15.         if(EXTI_GetITStatus(EXTI_Line0) !=RESET)
  16.         {
  17.         Back();
  18.         Systick_Delay_ms(300);
  19.         Turn_left();
  20.         Systick_Delay_ms(200);
  21.         straight();
  22.         EXTI_ClearITPendingBit(EXTI_Line0);
  23.         }
  24.         
  25. }
復(fù)制代碼
帖主的水平可能并沒(méi)有那么高,但是我愿與大家共同分享,一起進(jìn)步,歡迎吐槽打擾
下面包含所有文件:
基于STM32的雙路避障小車仿真圖源程序.7z (328.65 KB, 下載次數(shù): 151)

評(píng)分

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

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:328014 發(fā)表于 2020-11-18 05:05 | 只看該作者
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

板凳
ID:644292 發(fā)表于 2020-11-18 12:04 來(lái)自手機(jī) | 只看該作者
比賽用的?幾秒跑完?
回復(fù)

使用道具 舉報(bào)

地板
ID:644357 發(fā)表于 2020-11-18 14:57 來(lái)自手機(jī) | 只看該作者
51hei團(tuán)團(tuán) 發(fā)表于 2020-11-18 05:05
好資料,51黑有你更精彩!!!

謝謝管理員完善我的帖子
回復(fù)

使用道具 舉報(bào)

5#
ID:644357 發(fā)表于 2020-11-19 11:24 | 只看該作者
小制作 發(fā)表于 2020-11-18 12:04
比賽用的?幾秒跑完?

并不是比賽,自己做著玩的
回復(fù)

使用道具 舉報(bào)

6#
ID:846386 發(fā)表于 2020-11-22 11:36 | 只看該作者
繼續(xù)完善,加油干
回復(fù)

使用道具 舉報(bào)

7#
ID:644357 發(fā)表于 2020-11-24 10:18 來(lái)自手機(jī) | 只看該作者
kiccleaf 發(fā)表于 2020-11-22 11:36
繼續(xù)完善,加油干

后期會(huì)加入一個(gè)oled顯示屏,和一個(gè)4+  通道的pwm采集,用來(lái)捕獲天地飛的遙控信號(hào),
回復(fù)

使用道具 舉報(bào)

8#
ID:945217 發(fā)表于 2021-6-26 18:18 | 只看該作者
能加上超聲波模塊避障嗎?
回復(fù)

使用道具 舉報(bào)

9#
ID:644357 發(fā)表于 2023-5-5 09:16 | 只看該作者
hrh123 發(fā)表于 2021-6-26 18:18
能加上超聲波模塊避障嗎?

這個(gè)沒(méi)法在仿真里加,水平有限
回復(fù)

使用道具 舉報(bào)

10#
ID:644357 發(fā)表于 2023-5-5 09:17 | 只看該作者
小制作 發(fā)表于 2020-11-18 12:04
比賽用的?幾秒跑完?

自己愛(ài)好搞得,沒(méi)錢只能仿真
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表