项目五:基于stm32f103的寻迹小车

科技 科技 1530 人阅读 | 0 人回复

<
序言:传感器事情道理:
145750v2t3nbtrjxgy2ny3.jpg

代码部分: 
 
main.c
  1. #include "motor.h"
  2. #include <stdio.h>
  3. #include "delay.h"
  4. #include "stm32f10x.h"
  5. #include "followline.h"
  6. #include "ultrasonic.h"
  7. u8 UART3_data,UART1_data;
  8. u8 UART3_rcv[20],UART3_rcv_count;
  9. u8 UART1_rcv[50],UART1_rcv_count,Uart1_finish;
  10. int main(void)
  11. {
  12.             motor_pwm_TIME4_init(71,999);//机电PWM初初化
  13.             delay_init();//提早初初化
  14.             motor_GPIO_init();//机电管足初初化、觅迹管足初初化。
  15.         //int right_2=0,right_1=0 ,left_2=0,left_1=0;
  16.        
  17.         while(1)
  18.         {
  19.                 Car_fllow();
  20.    
  21.         }
  22. }  
复造代码
motor.c
  1. #include "motor.h"
  2. //机电GPIO管足初初化函数
  3. /**********************************************************************************/
  4. void motor_GPIO_init(void)
  5. {
  6.        
  7.         //界说管足的构造体
  8.         GPIO_InitTypeDef GPIO_InitStruct;
  9.         GPIO_InitTypeDef  GPIO_InitStruct_C,GPIO_InitStruct_B;
  10.        
  11.         //翻开所要利用的时钟
  12.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);
  13.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
  14.        
  15.         //将管足PB4特别功用闭失落
  16.         GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST,ENABLE);
  17.        
  18.         //设置PB4\5\8\9管足的参数,用于驱动机电。
  19.         GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
  20.         GPIO_InitStruct.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_8|GPIO_Pin_9;
  21.         GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
  22.         //设置PC13\14\15管足的参数,白别传感器。
  23.         GPIO_InitStruct_C.GPIO_Mode=GPIO_Mode_IN_FLOATING;
  24.         GPIO_InitStruct_C.GPIO_Pin=GPIO_Pin_14|GPIO_Pin_15|GPIO_Pin_13;
  25.         设置PB12管足的参数,白别传感器。
  26.         GPIO_InitStruct_B.GPIO_Mode=GPIO_Mode_IN_FLOATING;
  27.         GPIO_InitStruct_B.GPIO_Pin=GPIO_Pin_12;
  28.        
  29.         //初初化PB4\5\8\9的管足
  30.         GPIO_Init(GPIOB, &GPIO_InitStruct);
  31.         GPIO_Init(GPIOC, &GPIO_InitStruct_C);
  32.         GPIO_Init(GPIOB, &GPIO_InitStruct_B);
  33.         //设置PB6\7管足的参数,用于发生PWM波
  34.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
  35.         GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
  36.         GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  37.         //初初化PB6\7的管足
  38.         GPIO_Init(GPIOB, &GPIO_InitStruct);
  39.         //管足局部先置整
  40.         GPIO_ResetBits(GPIOB,GPIO_Pin_8);
  41.   GPIO_ResetBits(GPIOB,GPIO_Pin_9);
  42.         GPIO_ResetBits(GPIOB,GPIO_Pin_4);
  43.   GPIO_ResetBits(GPIOB,GPIO_Pin_5);
  44.        
  45. }
  46. /***************************************************************************************************************/
  47. //TIME4的初初化函数
  48. /********************************************************************************************/
  49. void motor_pwm_TIME4_init(int presc,int arr)
  50. {
  51.          //界说按时器的构造体
  52.          TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
  53.          //界说按时器PWM输出通讲的构造体
  54.          TIM_OCInitTypeDef TIM_OCInitStruct;
  55.          //翻开TIME4的时钟
  56.          RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
  57.          //设置TIME4构造体的参数
  58.          TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1 ;
  59.          TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
  60.          TIM_TimeBaseInitStruct.TIM_Prescaler = presc;
  61.          TIM_TimeBaseInitStruct.TIM_Period =arr;          
  62.          TIM_TimeBaseInit(TIM4, &TIM_TimeBaseInitStruct);
  63.          //设置TIME4通讲构造体的参数
  64.          TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;
  65.          TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;
  66.          TIM_OCInitStruct.TIM_OutputState =TIM_OutputState_Enable ;
  67.          TIM_OCInitStruct.TIM_Pulse =0;
  68.           //TIME4通讲1初初化
  69.    TIM_OC1Init(TIM4, &TIM_OCInitStruct);
  70.          //使能TIME4通讲1的预存存放器
  71.          TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);
  72.    //TIME4通讲2初初化
  73.    TIM_OC2Init(TIM4, &TIM_OCInitStruct);
  74.          //使能TIME4通讲2的预存存放器
  75.    TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);
  76.    //使能TIME4
  77.          TIM_Cmd(TIM4, ENABLE);
  78. }
  79. /*******************************************************************************************************/
  80. void Car_gostright(int speed)//曲止函数
  81.         {
  82.                 speed_left(speed);
  83.                 speed_right(speed);
  84.                 GPIO_SetBits(GPIOB, GPIO_Pin_9);
  85.    GPIO_ResetBits(GPIOB,GPIO_Pin_8);
  86.          GPIO_SetBits(GPIOB, GPIO_Pin_4);
  87.    GPIO_ResetBits(GPIOB,GPIO_Pin_5);
  88.         }
  89. void Car_back(int speed)//撤退退却
  90. {
  91.                 speed_left(speed);
  92.                 speed_right(speed);
  93.                 GPIO_SetBits(GPIOB,GPIO_Pin_8);//右边机电
  94.                 GPIO_ResetBits(GPIOB,GPIO_Pin_9);
  95.                 GPIO_ResetBits(GPIOB,GPIO_Pin_4);//右侧机电
  96.                 GPIO_SetBits(GPIOB,GPIO_Pin_5);
  97. }
  98. void Car_left(int speed_left,int speed_right)//小车左转
  99. {
  100.        
  101.         speed_left(speed_left);
  102.         speed_right(speed_right);
  103.         GPIO_ResetBits(GPIOB, GPIO_Pin_9);
  104.   GPIO_ResetBits(GPIOB,GPIO_Pin_8);
  105.         GPIO_SetBits(GPIOB, GPIO_Pin_4);
  106.   GPIO_ResetBits(GPIOB,GPIO_Pin_5);
  107. }
  108. void Car_right(int speed_left1,int speed_right1)//小车左转
  109. {
  110.         speed_left(speed_left1);
  111.         speed_right(speed_right1);
  112.         GPIO_SetBits(GPIOB, GPIO_Pin_9);
  113.   GPIO_ResetBits(GPIOB,GPIO_Pin_8);
  114.         GPIO_ResetBits(GPIOB, GPIO_Pin_4);
  115.   GPIO_ResetBits(GPIOB,GPIO_Pin_5);
  116. }       
  117. void Car_stop(void)
  118. {
  119.         GPIO_ResetBits(GPIOB,GPIO_Pin_8);//右边机电
  120.         GPIO_ResetBits(GPIOB,GPIO_Pin_9);
  121.         GPIO_ResetBits(GPIOB,GPIO_Pin_4);//右侧机电
  122.         GPIO_ResetBits(GPIOB,GPIO_Pin_5);
  123. }
  124. void Cra_left_revolve(int speed_left2,int speed_right2)//小车左曲角转直
  125. {
  126.         speed_left(speed_left2);
  127.         speed_right(speed_right2);
  128.         GPIO_ResetBits(GPIOB,GPIO_Pin_8);//右侧机电行进 8=0,9=1
  129.         GPIO_SetBits(GPIOB,GPIO_Pin_9);
  130.         GPIO_ResetBits(GPIOB,GPIO_Pin_4);//右边机电撤退退却4=0,5=1
  131.         GPIO_SetBits(GPIOB,GPIO_Pin_5);
  132. }       
  133. void Cra_right_revolve(int speed_left3,int speed_right3)//小车左曲角转直
  134. {
  135.         speed_left(speed_left3);
  136.         speed_right(speed_right3);
  137.         GPIO_ResetBits(GPIOB,GPIO_Pin_8);//右侧机电行进 8=0,9=1
  138.         GPIO_SetBits(GPIOB,GPIO_Pin_9);
  139.         GPIO_ResetBits(GPIOB,GPIO_Pin_4);//右边机电撤退退却4=0,5=1
  140.         GPIO_SetBits(GPIOB,GPIO_Pin_5);
  141. }       
  142. //提早一秒函数
  143. /****************************************************************************************************************/
  144. void delay_s(int s)
  145. {
  146.         for(;s>0;s--)
  147.         {
  148.         delay_ms(1000);
  149.         }
  150. }
  151. /****************************************************************************************************************/
复造代码
motor.h
  1. #ifndef __MOTOR_H__
  2. #define __MOTOR_H__
  3. //需求挪用的库
  4. #include "stm32f10x_rcc.h"
  5. #include "stm32f10x_gpio.h"
  6. #include "stm32f10x_tim.h"
  7. #include "delay.h"
  8. //宏界说
  9. #define PERIOD 10  //周期为10ms,频次为1Khz
  10. #define speed_left(speed)  {TIM_SetCompare2(TIM4, speed);}
  11. #define speed_right(speed)  {TIM_SetCompare1(TIM4, speed);}
  12. //自界说的函数
  13. void motor_GPIO_init(void);
  14. void motor_pwm_TIME4_init(int presc,int arr);
  15. void Car_stop(void);
  16. void Car_gostright(int speed);//小车曲走
  17. void Car_back(int speed);//小车撤退退却
  18. void Car_left(int speed_left,int speed_right);//小车左转
  19. void Car_right(int speed_left1,int speed_right1);//小车左转
  20. void Cra_left_revolve(int speed_left2,int speed_right2);//小车本天左转
  21. void Cra_right_revolve(int speed_left2,int speed_right2);//小车本天左转
  22. void Car_fllow(void);
  23. void delay_s(int s);
  24. #endif
复造代码
follow.c
  1. #include "followline.h"
  2. #include "motor.h"
  3. void Car_fllow(void)
  4. {
  5.         while(1)
  6.         {
  7.         int L1=1,L2=1,R1=1,R2=1;
  8.         L1=GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13);
  9.         L2=GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_14);
  10.         R1=GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_15);
  11.         R2=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12);
  12.         if(L1==1&&L2==0&&R1==0&&R2==1)//曲止
  13.         {
  14.                 Car_gostright(250);
  15.                 delay_ms(80);
  16.         }
  17.         else if((L1==1&&R1==1 )||(R1==1))//左转
  18.         {
  19.                
  20.                 Car_left(0,250);
  21.                 delay_ms(80);
  22.         }
  23.         else if((L1==1&&L2==1&&R1==0&&R2==1)||(L1==1))//左转
  24.         {
  25.                 Car_right(250,0);
  26.                 delay_ms(80);
  27.         }
  28.         else if((L1==0&&L2==0&&R1==0&&R2==1)||(L2==0&&R2==1))//左曲角转直
  29.         {
  30.                 Cra_left_revolve(250,250);
  31.                 delay_ms(80);
  32.         }
  33.         else if((L1==1&&L2==0&&R1==0&&R2==0)||(R2==0&&L2==1))//左曲角转直
  34.         {
  35.                 Cra_right_revolve(250,250);
  36.                 delay_ms(80);
  37.         }
  38.         else if(L1==1&&L2==1&&R1==1&&R2==1)//左曲角转直
  39.         {
  40.           Cra_right_revolve(250,250);
  41.                 delay_ms(80);
  42.         }
  43.         else
  44.         {
  45.                 Car_gostright(250);
  46.           delay_ms(80);
  47.         }
  48.        
  49. }
  50. }
复造代码
 follow.h
  1. #ifndef __FOLLOWLINE_H__
  2. #define __FOLLOWLINE_H__
  3. #include "stm32f10x_gpio.h"
  4. //读与四个传感器的值
  5. #define right_2  GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12)
  6. #define right_1  GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_15)
  7. #define left_2   GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_14)
  8. #define left_1   GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13)
  9. void followline_gpio_init(void);
  10. void Car_fllow(void);
  11. //void followline_function(int conut1,int count2);
  12. #endif
复造代码
写正在最初!!!普通逻辑出标题问题,次要调试参数,没有要不断修正法式逻辑, 调调传感器活络度啊,或则改改速率啊。

免责声明:假如进犯了您的权益,请联络站少,我们会实时删除侵权内乱容,感谢协作!
1、本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,按照目前互联网开放的原则,我们将在不通知作者的情况下,转载文章;如果原文明确注明“禁止转载”,我们一定不会转载。如果我们转载的文章不符合作者的版权声明或者作者不想让我们转载您的文章的话,请您发送邮箱:Cdnjson@163.com提供相关证明,我们将积极配合您!
2、本网站转载文章仅为传播更多信息之目的,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何损失或损害承担责任。
3、任何透过本网站网页而链接及得到的资讯、产品及服务,本网站概不负责,亦不负任何法律责任。
4、本网站所刊发、转载的文章,其版权均归原作者所有,如其他媒体、网站或个人从本网下载使用,请在转载有关文章时务必尊重该文章的著作权,保留本网注明的“稿件来源”,并自负版权等法律责任。
回复 关闭延时

使用道具 举报

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

本版积分规则