找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2344|回复: 0
打印 上一主题 下一主题
收起左侧

stm32f4单片机避障简易程序

[复制链接]
跳转到指定楼层
楼主
ID:432626 发表于 2018-11-24 22:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
参加比赛的程序分享

单片机源程序如下:
  1. #include"sys.h"
  2. #include"delay.h"
  3. //系统头文件
  4. #include"timer.h"
  5. #include"gpioin.h"
  6. //定时器头文件
  7. #include"l298nin.h"
  8. #include"pwm.h"
  9. //电机驱动头文件
  10. #include"oled.h"
  11. #include"iic.h"
  12. //显示屏头文件
  13. #include"motor.h"
  14. #include"calculate&pi.h"
  15. //编码器头文件


  16. //全局变量
  17. int Vocality[2];//速度值 取值范围在0~95之间
  18. int Pwm[2];
  19. int Encoder_Date[2];

  20. extern int flagA,flagB,flagC,flagD;
  21. extern int finishflag8;

  22. int main()
  23. {
  24.         Vocality[0] = 78;               
  25.         Vocality[1] = 78;
  26.        
  27.   delay_init(168);
  28.         led_init();
  29.        
  30.         gpioin_init();
  31.         l298nin_init();
  32.        
  33.         TIM3_Encoder_init();
  34.         TIM4_Encoder_init();//编码器信号捕捉初始化
  35.        
  36.         TIM13_pwm_init(499,8399);
  37.         TIM14_pwm_init(499,8399);//pwm输出初始化
  38.        
  39.         IIC_Init();
  40.         OLED_Init();//oled初始化
  41.        
  42.         TIM2_init(499,8399);//每50ms进入一次定时器中断,扫描光电开关的情况
  43.         TIM7_CAL_init(499,8399);//每0.1s进入一次定时器中断,进行pi控速
  44.        

  45.                
  46.         while(1)
  47.         {                               
  48.                                          motor_straight();                                 
  49. //由光电开关0进行卡边
  50.                                         if(gdian0)
  51.                                         {
  52.                                                 motor_only_left();
  53.                                                 while(gdian0);
  54.                                                 motor_straight();
  55.                                         }
  56. //由光电开关1进行转弯
  57.                                                 if(!gdian1)
  58.                                         {
  59.                                                 if(flagA) finishflag8 = 0;
  60.                                                 motor_only_right();
  61.                                                 while(!gdian1);
  62.                                                 delay(1500);
  63.                                                 if(!flagB)
  64.                                                 {
  65.                                                         delay(1200);
  66.                                                 }
  67.                                                 motor_straight();
  68.                                                 if(flagC) flagD = 1;
  69.                                                 if(flagB) flagC = 1;       
  70.                                                 if(flagA) flagB = 1;
  71.                                                 flagA  = 1;
  72.                                         }
  73.         }
  74.        
  75. }
复制代码

pwm:
  1. //pwm调速函数,用于调整EnA和EnB的电平



  2. #include"pwm.h"
  3. #include"sys.h"



  4. void TIM13_pwm_init(u16 arr,u16 psc)  //PF8引脚的控制即EnA
  5. {       
  6.         GPIO_InitTypeDef                                GPIO_Initstru;
  7.         TIM_TimeBaseInitTypeDef                        TIM_TimeBaseInitstru;
  8.         TIM_OCInitTypeDef                                             TIM_OCInitstru;//结构体指针变量
  9.        
  10.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM13,ENABLE);
  11.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);//时钟初始化
  12.        
  13.         GPIO_PinAFConfig(GPIOF,GPIO_PinSource8,GPIO_AF_TIM13);//复用功能映射
  14.        
  15.         GPIO_Initstru.GPIO_Mode  = GPIO_Mode_AF;
  16.         GPIO_Initstru.GPIO_OType = GPIO_OType_PP;
  17.         GPIO_Initstru.GPIO_Pin  = GPIO_Pin_8;
  18.         GPIO_Initstru.GPIO_Speed = GPIO_Speed_50MHz;
  19.                                 GPIO_Init(GPIOF,&GPIO_Initstru);//GPIO口初始化
  20.        
  21.         TIM_TimeBaseInitstru.TIM_Period = arr;
  22.         TIM_TimeBaseInitstru.TIM_Prescaler = psc;
  23.         TIM_TimeBaseInitstru.TIM_CounterMode  = TIM_CounterMode_Up;
  24.                                 TIM_TimeBaseInit(TIM13,&TIM_TimeBaseInitstru);//定时器初始化
  25.        
  26.         TIM_OC1PreloadConfig(TIM13,TIM_OCPreload_Enable);
  27.         TIM_ARRPreloadConfig(TIM13,ENABLE);//输出比较通道预装载
  28.        
  29.         TIM_OCInitstru.TIM_OCMode = TIM_OCMode_PWM1;
  30.         TIM_OCInitstru.TIM_OCPolarity = TIM_OCPolarity_Low;
  31.         TIM_OCInitstru.TIM_OutputState = TIM_OutputState_Enable;
  32.         TIM_OCInitstru.TIM_Pulse = 0;
  33.                                         TIM_OC1Init(TIM13,&TIM_OCInitstru);//输出比较通道初始化
  34.                                        
  35.         TIM_Cmd(TIM13,ENABLE);//打开定时器
  36. }       
  37.        
  38.        
  39.        
  40. void TIM14_pwm_init(u16 arr,u16 psc)  //PF9引脚的控制即EnB
  41. {       
  42.         GPIO_InitTypeDef                                GPIO_Initstru;
  43.         TIM_TimeBaseInitTypeDef                        TIM_TimeBaseInitstru;
  44.         TIM_OCInitTypeDef                                             TIM_OCInitstru;//结构体指针变量
  45.        
  46.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE);
  47.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);//时钟初始化
  48.        
  49.         GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14);//复用功能映射
  50.        
  51.         GPIO_Initstru.GPIO_Mode  = GPIO_Mode_AF;
  52.         GPIO_Initstru.GPIO_OType = GPIO_OType_PP;
  53.         GPIO_Initstru.GPIO_Pin  = GPIO_Pin_9;
  54.         GPIO_Initstru.GPIO_Speed = GPIO_Speed_50MHz;
  55.                                 GPIO_Init(GPIOF,&GPIO_Initstru);//GPIO口初始化
  56.        
  57.         TIM_TimeBaseInitstru.TIM_Period = arr;
  58.         TIM_TimeBaseInitstru.TIM_Prescaler = psc;
  59.         TIM_TimeBaseInitstru.TIM_CounterMode  = TIM_CounterMode_Up;
  60.                                 TIM_TimeBaseInit(TIM14,&TIM_TimeBaseInitstru);//定时器初始化
  61.        
  62.         TIM_OC1PreloadConfig(TIM14,TIM_OCPreload_Enable);
  63.         TIM_ARRPreloadConfig(TIM14,ENABLE);//输出比较通道预装载
  64.        
  65.         TIM_OCInitstru.TIM_OCMode = TIM_OCMode_PWM1;
  66.         TIM_OCInitstru.TIM_OCPolarity = TIM_OCPolarity_Low;
  67.         TIM_OCInitstru.TIM_OutputState = TIM_OutputState_Enable;
  68.         TIM_OCInitstru.TIM_Pulse = 0;
  69.                                         TIM_OC1Init(TIM14,&TIM_OCInitstru);//输出比较通道初始化
  70.                                        
  71.         TIM_Cmd(TIM14,ENABLE);//打开定时器
  72. }
复制代码

所有资料51hei提供下载:
32单片机.rar (482.16 KB, 下载次数: 11)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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