IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 基于正电源子STM32做的循迹小车 -> 正文阅读

[嵌入式]基于正电源子STM32做的循迹小车

基于正电源子STM32做的循迹小车

一.材料

  • 1.核心板
    2.驱动
    3.电源
    4.稳压模块
    5.循迹模块
    6.TT电机
    7.亚克力板

二.原理
这里以黑胶布为例,循迹模块将对于黑胶布方向调整的信息反馈到核心板中(原理在之前的51循迹小车所讲过,这里便不在提及51循迹小车),核心板处理信息控制电机对小车方向做出调整,使小车可以沿黑线移动。

三.代码思想
当小车偏左时,会导致右侧循迹模块触发并产生一个低电平。此时核心板检测到右侧循迹模块呈现低电平会执行右转函数,使小车及时修改轨迹,偏右时同理。当速度过快时小车来不及反应会冲出黑线,此时我们可以使用pwm将小车速度控制在一个合理范围。

四.代码

电机控制

#ifndef __MOTO_H
#define __MOTO_H
#include "sys.h"

#define IN1 PFout(6)
#define IN2 PFout(7)
#define IN3 PFout(8)
#define IN4 PEout(2)
#define IN5 PGout(6)
#define IN6 PGout(7)
#define IN7 PGout(8)
#define IN8 PEout(3)
#define R1 PEin(6)
#define R2 PEin(7)
#define R3 PEin(8)


void xunji_Init(void);
void MOTO_GPIO_Init(void);
					
void Car_Go(void);
void Car_Back(void);									
void Car_Turn_Right(void);
void Car_Turn_Left(void);
void Car_Stop(void);
void Car_Right_90_Init(void);
void Car_Left_90_Init(void);
#endif

#include "moto.h"
#include "stm32f10x.h"
#include "pwm.h"



void MOTO_GPIO_Init(void)
{		
		/*?¨ò?ò???GPIO_InitTypeDefààDíμ??á11ì?*/
		GPIO_InitTypeDef GPIO_InitStructure;
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF|RCC_APB2Periph_GPIOG|RCC_APB2Periph_GPIOE, ENABLE);                                	  /*?a??GPIOμ?íaéèê±?ó*/																   
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
  	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6| GPIO_Pin_7 | GPIO_Pin_8;	    /*????òa????μ?GPIOòy??*/	
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                              /*éè??òy???£ê??aí¨ó?í?íìê?3?*/   
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                             /*éè??òy???ù?ê?a50MHz */ 
		GPIO_Init(GPIOF, &GPIO_InitStructure);                                	/*μ÷ó??aoˉêy£?3?ê??ˉGPIO*/			
	
	  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2| GPIO_Pin_3;	    /*????òa????μ?GPIOòy??*/	
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                              /*éè??òy???£ê??aí¨ó?í?íìê?3?*/   
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                             /*éè??òy???ù?ê?a50MHz */ 
		GPIO_Init(GPIOE, &GPIO_InitStructure);                                	/*μ÷ó??aoˉêy£?3?ê??ˉGPIO*/		

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6| GPIO_Pin_7 | GPIO_Pin_8;	    /*????òa????μ?GPIOòy??*/	
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                              /*éè??òy???£ê??aí¨ó?í?íìê?3?*/   
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                             /*éè??òy???ù?ê?a50MHz */ 
		GPIO_Init(GPIOG, &GPIO_InitStructure);                                	/*μ÷ó??aoˉêy£?3?ê??ˉGPIO*/		
	
	  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;	    /*????òa????μ?GPIOòy??*/	
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                              /*éè??òy???£ê??aí¨ó?í?íìê?3?*/   
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                             /*éè??òy???ù?ê?a50MHz */ 
		GPIO_Init(GPIOA, &GPIO_InitStructure);                                	/*μ÷ó??aoˉêy£?3?ê??ˉGPIO*/	
}


void Car_Go()
{

	TIM_SetCompare3(TIM3,370);		   
	TIM_SetCompare2(TIM5,530);		   
	TIM_SetCompare3(TIM4,370);		   
	TIM_SetCompare4(TIM4,400);	
	IN1 = 1;
	IN2 = 0;
	IN3 = 1;
	IN4 = 0;
	IN5 = 1;
	IN6 = 0;
	IN7 = 1;
	IN8 = 0;
}

void Car_Back()
{
	TIM_SetCompare3(TIM3,370);		   
	TIM_SetCompare2(TIM5,530);		   
	TIM_SetCompare3(TIM4,370);		   
	TIM_SetCompare4(TIM4,400);	
	IN1 = 0;
	IN2 = 1;
	IN3 = 0;
	IN4 = 1;
	IN5 = 0;
	IN6 = 1;
	IN7 = 0;
	IN8 = 1;
}

void Car_Turn_Right()
{
	TIM_SetCompare3(TIM3,370);		   
	TIM_SetCompare2(TIM5,350);		   
	TIM_SetCompare3(TIM4,370);		   
	TIM_SetCompare4(TIM4,400);	
	IN1 = 1;
	IN2 = 0;
	IN3 = 0;
	IN4 = 1;
	IN5 = 0;
	IN6 = 1;
	IN7 = 1;
	IN8 = 0;
}
void Car_Turn_Left()
{
	TIM_SetCompare3(TIM3,370);		   
	TIM_SetCompare2(TIM5,350);		   
	TIM_SetCompare3(TIM4,370);		   
	TIM_SetCompare4(TIM4,400);	
	IN1 = 0;
	IN2 = 1;
	IN3 = 1;
	IN4 = 0;
	IN5 = 1;
	IN6 = 0;
	IN7 = 0;
	IN8 = 1;
}
void Car_Stop()
{
 IN1 = 0;
 IN2 = 0;
 IN3 = 0;
 IN4 = 0;
 IN5 = 0;
 IN6 = 0;
 IN7 = 0;
 IN8 = 0;
}
void Car_Right_90_Init()
{
	TIM_SetCompare3(TIM3,340);		   
	TIM_SetCompare2(TIM5,390);		   
	TIM_SetCompare3(TIM4,385);		   
	TIM_SetCompare4(TIM4,385);	
	IN1 = 1;
	IN2 = 0;
	IN3 = 0;
	IN4 = 1;
	IN5 = 0;
	IN6 = 1;
	IN7 = 1;
	IN8 = 0;

}
void Car_Left_90_Init()
{
	TIM_SetCompare3(TIM3,340);		   
	TIM_SetCompare2(TIM5,390);		   
	TIM_SetCompare3(TIM4,385);		   
	TIM_SetCompare4(TIM4,385);	
	IN1 = 0;
	IN2 = 1;
	IN3 = 1;
	IN4 = 0;
	IN5 = 1;
	IN6 = 0;
	IN7 = 0;
	IN8 = 1;

}

PWM

#ifndef __TIMER_H
#define __TIMER_H
#include "sys.h"

void TIM4_PWM_Init(u16 arr,u16 psc);
#endif


#include "pwm.h"
#include "stm32f10x.h"

void TIM4_PWM_Init(u16 arr,u16 psc)
{  
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);	//ê1?ü?¨ê±?÷3ê±?ó
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  | RCC_APB2Periph_AFIO, ENABLE);  //ê1?üGPIOíaéèoíAFIO?′ó?1|?ü?£?éê±?ó
	 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA  | RCC_APB2Periph_AFIO, ENABLE);  
//	GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer32?·???ó3é?  TIM3_CH2->PB5    
 
   //éè????òy???a?′ó?ê?3?1|?ü,ê?3?TIM3 CH2μ?PWM??3?2¨D?	GPIOB.5
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9; //TIM_CH2
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //?′ó?í?íìê?3?
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);//3?ê??ˉGPIO
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //TIM_CH2
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //?′ó?í?íìê?3?
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);//3?ê??ˉGPIO
	
	TIM_TimeBaseStructure.TIM_Period = arr; //éè???ú??ò????üD?ê??t×°è????ˉμ?×??ˉ??×°????′??÷?ü?úμ??μ
	TIM_TimeBaseStructure.TIM_Prescaler =psc; //éè??ó?à′×÷?aTIMxê±?ó?μ?ê3yêyμ??¤·??μ?μ 
	TIM_TimeBaseStructure.TIM_ClockDivision = 0; //éè??ê±?ó·???:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM?òé???êy?£ê?
	TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); //?ù?YTIM_TimeBaseInitStruct?D???¨μ?2?êy3?ê??ˉTIMxμ?ê±???ùêyμ¥??
 
   //3?ê??ˉTIM3 TIM4
	TIM_TimeBaseStructure.TIM_Period = arr; //éè???ú??ò????üD?ê??t×°è????ˉμ?×??ˉ??×°????′??÷?ü?úμ??μ
	TIM_TimeBaseStructure.TIM_Prescaler =psc; //éè??ó?à′×÷?aTIMxê±?ó?μ?ê3yêyμ??¤·??μ?μ 
	TIM_TimeBaseStructure.TIM_ClockDivision = 0; //éè??ê±?ó·???:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM?òé???êy?£ê?
	TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //?ù?YTIM_TimeBaseInitStruct?D???¨μ?2?êy3?ê??ˉTIMxμ?ê±???ùêyμ¥??
	
	TIM_TimeBaseStructure.TIM_Period = arr; //éè???ú??ò????üD?ê??t×°è????ˉμ?×??ˉ??×°????′??÷?ü?úμ??μ
	TIM_TimeBaseStructure.TIM_Prescaler =psc; //éè??ó?à′×÷?aTIMxê±?ó?μ?ê3yêyμ??¤·??μ?μ 
	TIM_TimeBaseStructure.TIM_ClockDivision = 0; //éè??ê±?ó·???:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM?òé???êy?£ê?
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //?ù?YTIM_TimeBaseInitStruct?D???¨μ?2?êy3?ê??ˉTIMxμ?ê±???ùêyμ¥??
	
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //?????¨ê±?÷?£ê?:TIM??3??í?èμ÷???£ê?2
 	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //±è??ê?3?ê1?ü
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //ê?3???D?:TIMê?3?±è????D???
	TIM_OC3Init(TIM3, &TIM_OCInitStructure);  //?ù?YT???¨μ?2?êy3?ê??ˉíaéèTIM4 OC2
	
	//3?ê??ˉTIM3 Channel2 PWM?£ê?	 
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //?????¨ê±?÷?£ê?:TIM??3??í?èμ÷???£ê?2
 	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //±è??ê?3?ê1?ü
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //ê?3???D?:TIMê?3?±è????D???
	TIM_OC2Init(TIM5, &TIM_OCInitStructure);  //?ù?YT???¨μ?2?êy3?ê??ˉíaéèTIM4 OC2
	
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //?????¨ê±?÷?£ê?:TIM??3??í?èμ÷???£ê?2
 	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //±è??ê?3?ê1?ü
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //ê?3???D?:TIMê?3?±è????D???
	TIM_OC3Init(TIM4, &TIM_OCInitStructure);  //?ù?YT???¨μ?2?êy3?ê??ˉíaéèTIM4 OC3
	
	

  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //?????¨ê±?÷?£ê?:TIM??3??í?èμ÷???£ê?2
 	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //±è??ê?3?ê1?ü
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //ê?3???D?:TIMê?3?±è????D???
	TIM_OC4Init(TIM4, &TIM_OCInitStructure);  //?ù?YT???¨μ?2?êy3?ê??ˉíaéèTIM4 OC4
	
	TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);
	TIM_OC2PreloadConfig(TIM5, TIM_OCPreload_Enable);
	TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);
	TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);  //ê1?üTIM3?úCCR2é?μ??¤×°????′??÷
 
  TIM_Cmd(TIM3, ENABLE);
	TIM_Cmd(TIM4, ENABLE);  //ê1?üTIM3
	TIM_Cmd(TIM5, ENABLE);
	

}

main

#include "moto.h"
#include "delay.h"
#include "pwm.h"
#include "usart.h"

u8 flag;

int main()
{

	  MOTO_GPIO_Init();
	  uart_init(38400);
	  delay_init();
	  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	  TIM4_PWM_Init(899,0);	 
while(1)
   {

		 
		 
		 
		 
		 
		 
		 
		 if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_6)==0)
		 {
       Car_Turn_Right();//×ó×a
		 } 
		 
		 else if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_7)==8)
		 {
			  Car_Go();

		 }
		 else if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_8)==8)
		 {
		    Car_Turn_Left();
		 }
		 else
		 {
	      Car_Stop();
		 }
	 }
 }
	 

根据IO口作用进行连线,PWM因车而异,需要自己去调整。

如何还有其他问题请留言,我看到了会帮你一起解决。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-09-20 15:56:14  更:2021-09-20 15:57:25 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 2:22:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码