找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STM32黑线循迹智能小车的代码

[复制链接]
跳转到指定楼层
楼主
ID:297748 发表于 2018-12-9 22:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机源程序如下:
  1. #include "motor.h"
  2. #include "Math.h"
  3. #include "delay.h"
  4. #include "stm32f10x.h"                  // Device header

  5. signed short sPWMR,sPWML,dPWM;

  6. //GPIO配置函数
  7. /*void MotorGPIO_Configuration(void)
  8. {               
  9.         GPIO_InitTypeDef GPIO_InitStructure;
  10.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE);         //使能PA,PB端口时钟
  11.         
  12.         GPIO_InitStructure.GPIO_Pin = LEFT_MOTOR_GO;         //左电机方向控制
  13.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  14.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         
  15.         GPIO_Init(LEFT_MOTOR_GO_GPIO, &GPIO_InitStructure);   
  16.         
  17.         GPIO_InitStructure.GPIO_Pin = LEFT_MOTOR_PWM;        
  18.         GPIO_Init(LEFT_MOTOR_PWM_GPIO, &GPIO_InitStructure);
  19.         
  20.         
  21.          GPIO_InitStructure.GPIO_Pin = RIGHT_MOTOR_PWM;        
  22.         GPIO_Init(RIGHT_MOTOR_PWM_GPIO, &GPIO_InitStructure);
  23.         
  24.         GPIO_InitStructure.GPIO_Pin = RIGHT_MOTOR_GO;
  25.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  26.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                 
  27.         GPIO_Init(RIGHT_MOTOR_GPIO, &GPIO_InitStructure);
  28.         
  29. }

  30. void run()     //前进
  31. {
  32.         RIGHT_MOTOR_GO_SET;
  33.         RIGHT_MOTOR_PWM_RESET;//PB9
  34.         
  35.         LEFT_MOTOR_GO_SET;
  36.         LEFT_MOTOR_PWM_RESET;//PB8
  37.         
  38.         
  39. }
  40. */

  41. void TIM4_PWM_Init(unsigned short arr,unsigned short psc)
  42. {
  43.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  44.         TIM_OCInitTypeDef  TIM_OCInitStructure;
  45.   GPIO_InitTypeDef GPIO_InitStructure;
  46.         
  47.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);//
  48.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB , ENABLE);  //使能GPIO外设时钟使能   
  49.         
  50.   GPIO_InitStructure.GPIO_Pin = LEFT_MOTOR_GO;         //左电机方向控制 PB7
  51.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  52.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         
  53.         GPIO_Init(LEFT_MOTOR_GO_GPIO, &GPIO_InitStructure);  
  54.         
  55.         GPIO_InitStructure.GPIO_Pin = LEFT_MOTOR_PWM;         //左电机PWM控制 PB8
  56.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  57.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;            //复用推挽输出
  58.         GPIO_Init(LEFT_MOTOR_PWM_GPIO, &GPIO_InitStructure);  
  59.                
  60.         
  61.   GPIO_InitStructure.GPIO_Pin = RIGHT_MOTOR_GO;       //右电机方向控制  PA4
  62.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  63.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                 
  64.         GPIO_Init(RIGHT_MOTOR_GPIO, &GPIO_InitStructure);
  65.         
  66.         
  67.         GPIO_InitStructure.GPIO_Pin = RIGHT_MOTOR_PWM;       //右电机PWM控制  PB9
  68.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  69.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;            //复用推挽输出
  70.         GPIO_Init(RIGHT_MOTOR_PWM_GPIO, &GPIO_InitStructure);  
  71.         
  72.         TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值         80K
  73.         TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  不分频
  74.         TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
  75.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
  76.         TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
  77.         
  78.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
  79.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  80.         TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
  81.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
  82.         TIM_OC3Init(TIM4, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
  83.         TIM_OC4Init(TIM4, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
  84.         
  85.         TIM_CtrlPWMOutputs(TIM4,ENABLE);        //MOE 主输出使能        
  86.   
  87.         TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);  //CH1预装载使能         
  88.         TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);  //CH1预装载使能
  89.         
  90.   TIM_ARRPreloadConfig(TIM4, ENABLE); //使能TIMx在ARR上的预装载寄存器
  91.          TIM_Cmd(TIM4, ENABLE);  //使能TIM1   
  92. }

  93. void SetMotorSpeed(unsigned char ucChannel,signed char cSpeed)
  94. {
  95. //                static short sMotorSpeed = 0;
  96.                 short sPWM;
  97. //          float fDir = 1;
  98.         
  99.                 if (cSpeed>=100) cSpeed = 100;
  100.           if (cSpeed<=-100) cSpeed = -100;
  101.         
  102.            sPWM = 7201 - fabs(cSpeed)*72;
  103.         switch(ucChannel)
  104.         {
  105.                 case 0://右轮
  106.                         TIM_SetCompare3(TIM4,sPWM);
  107.                         if (cSpeed>0)
  108.                                 RIGHT_MOTOR_GO_RESET;
  109.                         else if(cSpeed<0)
  110.                                 RIGHT_MOTOR_GO_SET;               
  111.                         break;
  112.                 case 1://左轮
  113.                   TIM_SetCompare4(TIM4,sPWM);
  114.                         if (cSpeed>0)
  115.                                 LEFT_MOTOR_GO_SET;
  116.                         else if (cSpeed<0)
  117.                                 LEFT_MOTOR_GO_RESET;
  118.                         break;                        
  119.         }
  120. }

  121. //----------------------------------运动函数--------------------------------
  122. void ZYSTM32_run(signed char speed,int time)  //前进函数
  123. {
  124.                   signed char f_speed = - speed;
  125.             SetMotorSpeed(1,f_speed);//左轮  //为负数
  126.                         SetMotorSpeed(0,speed);//右轮   //为正数
  127.                         delay_ms(time);                 //时间为毫秒

  128. }

  129. void ZYSTM32_brake(int time) //刹车函数
  130. {
  131.           SetMotorSpeed(1,0);//左轮   //为0
  132.           SetMotorSpeed(0,0);//右轮   //为0
  133.           RIGHT_MOTOR_GO_RESET;
  134.           LEFT_MOTOR_GO_RESET;
  135.                 delay_ms(time);             //时间为毫秒  
  136. }

  137. void ZYSTM32_Left(signed char speed,int time) //左转函数
  138. {
  139.           SetMotorSpeed(1,0);//左轮     //左轮不动
  140.           SetMotorSpeed(0,speed);        //右轮为正
  141.                 delay_ms(time);                 //时间为毫秒  

  142. }
  143. void ZYSTM32_Spin_Left(signed char speed,int time) //左旋转函数
  144. {
  145.           SetMotorSpeed(1,speed);//左轮     //左轮为正
  146.           SetMotorSpeed(0,speed);            //右轮为正
  147.                 delay_ms(time);                    //时间为毫秒  

  148. }
  149. void ZYSTM32_Right(signed char speed,int time)  //右转函数
  150. {
  151.           signed char f_speed = - speed;
  152.           SetMotorSpeed(1,f_speed);//左轮     //左轮为负
  153.           SetMotorSpeed(0,0);                 //右轮为0
  154.                 delay_ms(time);                   //时间为毫秒  

  155. }
  156. void ZYSTM32_Spin_Right(signed char speed,int time) //右旋转函数
  157. {
  158.           signed char f_speed = - speed;
  159.           SetMotorSpeed(1,f_speed);//左轮     //左轮为负
  160.           SetMotorSpeed(0,f_speed);            //右轮为负
  161.                 delay_ms(time);                    //时间为毫秒  

  162. }
  163. void ZYSTM32_back(signed char speed,int time) //后退函数
  164. {
  165.           signed char f_speed = - speed;
  166.           SetMotorSpeed(1,speed);//左轮   //为正数
  167.           SetMotorSpeed(0,f_speed);//右轮 //为负数
  168.                 delay_ms(time);                 //时间为毫秒  

  169. }
复制代码

所有资料51hei提供下载:
4、ZYSTM32-A0 智能小车黑线循迹实验.rar (330.42 KB, 下载次数: 111)


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

使用道具 举报

沙发
ID:1 发表于 2018-12-10 03:28 | 只看该作者
补全原理图或者详细说明一下电路连接即可获得100+黑币
回复

使用道具 举报

板凳
ID:855317 发表于 2020-12-6 12:40 | 只看该作者
原理图
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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