找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5674|回复: 9
收起左侧

STM32双路避障小车制作 附源程序仿真电路图

  [复制链接]
ID:644357 发表于 2020-11-17 20:21 | 显示全部楼层 |阅读模式
材料清单:
    1供电:12V航模电池,12V~5V转电压模块,开关*1
    2控制:STM32C8T6最小系统板,红外避障模块*2
    3驱动:L298N驱动模块*2
    4对象:电机*4的小车
注:红色部分不可缺。


放实物图
   

32避障小车实物图

32避障小车实物图


线路连接图

  

线路原理图

线路原理图


仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei.png

(避障模块没有放进去因为是低电平触发,两个避障模块接B0,B1口)


STM32单片机源程序文件:
  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. }
复制代码
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.          //开启定时器3的时钟
  59.          RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
  60.          
  61.          //TIM3重映射
  62.          GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);
  63.          
  64.          // 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
  65.         TIM_TimeBaseStructure.TIM_Period = period;        
  66.          
  67.         // 驱动CNT计数器的时钟 = Fck_int/(psc+1)
  68.         TIM_TimeBaseStructure.TIM_Prescaler = Prescaler;
  69.          
  70.          //时钟分割
  71.         TIM_TimeBaseStructure.TIM_ClockDivision = 0;  
  72.          
  73. //        // 时钟分频因子 ,配置死区时间时需要用到
  74. //        TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;               

  75.         // 计数器计数模式,设置为向上计数
  76.         TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;               
  77.         // 重复计数器的值,没用到不用管
  78.         //TIM_TimeBaseStructure.TIM_RepetitionCounter=0;        
  79.         
  80.         // 初始化定时器
  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.         // 互补输出使能
  90.         //TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
  91.         
  92.         
  93.         // 设置脉冲宽度 CRR的值,0-65535
  94.         TIM_OCInitStructure.TIM_Pulse = Pulse;
  95.         
  96.         // 输出通道电平极性配置
  97.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  98.         // 互补输出通道电平极性配置
  99.         //TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
  100.         
  101.         // 输出通道空闲电平极性配置
  102.         //TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
  103.         // 互补输出通道空闲电平极性配置
  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.         // 主输出使能,当使用的是通用定时器时,这句不需要
  117.         //TIM_CtrlPWMOutputs(ADVANCE_TIM, ENABLE);
  118. }

  119. //电机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. //电机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. //电机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. //电机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. }
复制代码
中断服务函数
  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. }
复制代码
帖主的水平可能并没有那么高,但是我愿与大家共同分享,一起进步,欢迎吐槽打扰
下面包含所有文件:
基于STM32的双路避障小车仿真图源程序.7z (328.65 KB, 下载次数: 151)

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:328014 发表于 2020-11-18 05:05 | 显示全部楼层
好资料,51黑有你更精彩!!!
回复

使用道具 举报

ID:644292 发表于 2020-11-18 12:04 来自手机 | 显示全部楼层
比赛用的?几秒跑完?
回复

使用道具 举报

ID:644357 发表于 2020-11-18 14:57 来自手机 | 显示全部楼层
51hei团团 发表于 2020-11-18 05:05
好资料,51黑有你更精彩!!!

谢谢管理员完善我的帖子
回复

使用道具 举报

ID:644357 发表于 2020-11-19 11:24 | 显示全部楼层
小制作 发表于 2020-11-18 12:04
比赛用的?几秒跑完?

并不是比赛,自己做着玩的
回复

使用道具 举报

ID:846386 发表于 2020-11-22 11:36 | 显示全部楼层
继续完善,加油干
回复

使用道具 举报

ID:644357 发表于 2020-11-24 10:18 来自手机 | 显示全部楼层
kiccleaf 发表于 2020-11-22 11:36
继续完善,加油干

后期会加入一个oled显示屏,和一个4+  通道的pwm采集,用来捕获天地飞的遥控信号,
回复

使用道具 举报

ID:945217 发表于 2021-6-26 18:18 | 显示全部楼层
能加上超声波模块避障吗?
回复

使用道具 举报

ID:644357 发表于 2023-5-5 09:16 | 显示全部楼层
hrh123 发表于 2021-6-26 18:18
能加上超声波模块避障吗?

这个没法在仿真里加,水平有限
回复

使用道具 举报

ID:644357 发表于 2023-5-5 09:17 | 显示全部楼层
小制作 发表于 2020-11-18 12:04
比赛用的?几秒跑完?

自己爱好搞得,没钱只能仿真
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表