四轮两驱小车(四):STM32驱动5路灰度传感器PID循迹

这篇具有很好参考价值的文章主要介绍了四轮两驱小车(四):STM32驱动5路灰度传感器PID循迹。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

前言:

小车效果展示:

5路数字灰度传感器:

巡线思路:

加入PID调节的代码:


前言:

        之前买了一批5路灰度传感器,想用这传感器进行循迹,无奈网上和官方的资料提供的还是比较少,这里还是做一下当初的学习记录。

小车效果展示:

STM32RCT6主控,5路灰度寻迹,超声波HC_SR04中断式测距,蓝牙模块HC_08通信,AS4950电机驱动芯片,减缓了MPU6050零漂问题,PID丝滑_哔哩哔哩_bilibili

5路数字灰度传感器:

         这是某宝上买的5路灰度传感器,价格稍微有点贵,50多块一个。当然,一分钱一分货,这个模块可以用小螺丝刀来调节传感器上面的旋钮,通过这个旋钮来调节灵敏度,这个灵敏度调节好了的话可以识别黑白循迹、红白循迹。所以还是比较值得的。

        对于这款5路数字灰度传感器来说。识别到黑线,传回来的数字量就是0,识别到白色,传回来的数字量就是1。五路灰度传感器电路设计实验报告,智能车,stm32,嵌入式硬件

巡线思路:

        博主想着用这5路的中间三路来巡线,用最左和最右端的传感器用来识别十字或者丁字路口,巡线时,加入PID算法,遇到十字或者丁字路口就用最左和最右的传感器来识别,识别到了之后,我们就可以搭配MPU6050进行转90°弯了。

加入PID调节的代码:

        其中 sensor_bias 是根据中间三路传感器和黑线的相对位置来估计出的误差(如果你要问我怎么得来的,其实这个数据大差不差就行,它只是为PID服务的一个变量罢了,甚至你可以把62.5改成50,最后只要调好PID三个参数,达到的效果是一样的),这里的decide类似于状态机的信号,我令decide为6的时候,也就是小车跑出了黑线,小车停止。

#include "sensor.h"
#include "stm32f10x.h"
#include "move.h"
#include "motor.h"
#include "FSM.h"

//STEER4 		--> PA11  --> R2  红线
//STEER3 		--> PC9 	--> R1  橘线
//			 		--> PB4   --> M0  黄线
//STEER1 		--> PA6   --> L1  绿线
//ENCODE1_A --> PB5	  --> L2  棕线

float Kp_sensor = 8.134, Ki_sensor = 0.021, Kd_sensor = 2.36;//pid弯道参数参数 
float sensor_bias = 0;
float sensor_bias_last = 0;
float P = 0, I = 0, D = 0, PID_value = 0;  //pid直道参数 
int decide;

unsigned char move_flag;
extern unsigned char FSM_state;
void sensor_Init()
{
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//开启C时钟   PC9
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
	//GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//这句话其实可以不用,在使用输入功能时,不需要配置频率
	GPIO_Init(GPIOC, &GPIO_InitStructure);
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启A时钟  PA11  PA6
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11|GPIO_Pin_6;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST, ENABLE); 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//开启B时钟  PB4  PB5
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
}

unsigned char times;
extern unsigned char FSM_hc08;
unsigned char back_flag;
unsigned char one_time;
unsigned char one_flag;
unsigned char channel_num;//channel的存在导致发送2号通道的时候只会进入一次
void sensor_read()
{
	if((L2 == 1)&&(L1 == 1)&&(M0 == 1)&&(R1 == 0))// 1 1 1 0 
	{
		if(one_time == 0)
		{
			if(FSM_hc08 == Channel_1)
			{
				FSM_state = Turn_lift_state;//跳出循环,将PID分别清零。
				one_time++;
				P = 0;I = 0; D = 0;
			}
			else if(FSM_hc08 == Channel_2)
			{
				if(one_flag == 0)
				{
					channel_num++;
					one_flag = 1;
				}
				if(channel_num == 2)
				{	
					FSM_state = stay2_state;//跳出循环,将PID分别清零。
					one_time++;
					P = 0;I = 0; D = 0;
				}
			}
		}
	}
	else if((L1 == 0)&&(M0 == 1)&&(R1 == 0))// 0 1 0 
	{
		sensor_bias = 0;decide = 3;one_flag = 0;//积分项清零
	}
	else if((L1 == 1)&&(M0 == 1)&&(R1 == 0))// 1 1 0 
	{
		sensor_bias = -62.5;decide = 2;
	}
	else if((L1 == 0)&&(M0 == 1)&&(R1 == 1))// 0 1 1 
	{
		sensor_bias = 62.5;decide = 2;
	}
	else if((L1 == 1)&&(M0 == 0)&&(R1 == 0))// 1 0 0 
	{
		sensor_bias = -125;decide = 4;
	}
	else if((L1 == 0)&&(M0 == 0)&&(R1 == 1))// 0 0 1 
	{
		sensor_bias = 62.5;decide = 4;
	}
	else if((L1 == 0)&&(M0 == 0)&&(R1 == 0))// 0 0 0 
	{
		decide = 6;
	}
	else if((L1 == 1)&&(M0 == 1)&&(R1 == 1))// 1 1 1 
	{
		decide = 6;FSM_state = Judge_state;		//如果读取到了整条黑线,那么就进入下一状态
		if(back_flag == 1)
		{
			FSM_state = Back_state;
			back_flag = 0;
		}			//第一次识别到全黑线为小车停止线。第二次识别到,代表小车即将回归循迹
	}

}
void Sensor_pid()
{
	if(decide<=5)
	{
		P = sensor_bias;
		I = I + sensor_bias;
		D = sensor_bias-sensor_bias_last;
		PID_value = Kp_sensor*P + Ki_sensor*I + Kd_sensor*D;
		sensor_bias_last = sensor_bias;
		//对积分值设置一个限制,防止积分值超标
		
		if(I >=3500)I = 3500;
		if(I <= -3500)I = -3500;
		PWM_value_R = 2099 - (int)PID_value;
		PWM_value_L = 2099 + (int)PID_value;//当线在左,左轮要慢,右轮要快,左轮要加,右轮要减,但这里的偏差是负值
		Motor3_forward(PWM_value_R);
		Motor4_forward(PWM_value_L);
		//4 --> 右电机
		//3 --> 左电机	
	}
	else{
		Move_stop();
	}
}

        对应的头文件部分文章来源地址https://www.toymoban.com/news/detail-777886.html

#ifndef __SENSOR_H
#define __SENSOR_H

//STEER4 --> PA11 --> R2  绿线
//STEER3 --> PC9 	--> R1  黄线
//		B  --> PB6  --> M0  橘线
//STEER1 --> PA6  --> L1  红线
// 		A  --> PB7	--> L2  白线
// 灰度传感器,当传感器识别到黑线的时候,输出为1,其余时刻输出为0
// 所以在这里我们要使用下拉输入
#define L2 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)
#define L1 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6)
#define M0 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_4)
#define R1 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_9)
#define R2 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)

void sensor_Init(void);
void sensor_read(void);
void Sensor_pid(void);

#endif

到了这里,关于四轮两驱小车(四):STM32驱动5路灰度传感器PID循迹的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32外设芯片驱动学习记录 —— (一) BH1750光照传感器驱动开发

    一、芯片介绍 二、Datasheet解读 1.硬件说明 2.寄存器说明 3.通信过程 三、驱动代码编写 1.软件I2C驱动 2. BH1750芯片驱动函数 总结             BH1750是16位数字输出型,环境光强度传感器集成电路,使用I2C接口通信,工作电压:VCC(2.4~3.6V),I2C电平(1.65~VCC),用于各类消费类LCD屏

    2024年02月02日
    浏览(82)
  • 超详细!!STM32-ADC模数转换器-驱动内部温度传感器

      在STM32微控制器系列中,ADC(Analog-to-Digital Converter)是一个重要的外设模块,它允许微控制器将模拟信号转换成数字信号以进行处理。模拟信号–数字信号。    MCU只能处理数字量(10011001),如果需要MCU区分模拟输入信号时,MCU直接做不了,需要将模拟信号通过模数转换

    2024年02月19日
    浏览(45)
  • STM32+HAL库驱动ADXL345传感器(SPI协议)

    ADXL345 是 ADI 公司推出的基于 iMEMS 技术的 3 轴、数字输出加速度传感器。该加速度传感器的特点有: a. 分辨率高。最高 13 位分辨率。 b. 量程可变。具有+/-2g, +/-4g, +/-8g, +/-16g 可变的测量范围。 c. 灵敏度高。最高达 3.9mg/LSB,能测量不到 1.0°的倾斜角度变化。 d. 功耗低。

    2024年01月17日
    浏览(35)
  • 基于STM32_DS18B20单总线传感器驱动

    本文以一款典型的单总线传感器及其驱动——DS18B20为例,简单对1-Wire总线接口的传感器做个示例讲解,该项目基于硬件平台STM32F407,使用标准库本完成。 DS18B20数字温度计提供9至12位(可配置)温度读数,指示设备的温度。信息通过1-Wire总线接口发送到/从DS18B20,因此只需要从中

    2024年02月07日
    浏览(49)
  • Clion开发Stm32之温湿度传感器(DHT11)驱动编写

    涵盖之前文章: Clion开发STM32之HAL库GPIO宏定义封装(最新版) Clion开发stm32之微妙延迟(采用nop指令实现) Clion开发STM32之日志模块(参考RT-Thread) 头文件 源文件

    2024年02月15日
    浏览(43)
  • STM32Cubemxhal库硬件IIC驱动SHT40温湿度传感器

    STM32cubemx配置硬件IIC如图所示  SHT40的驱动代码 注意:在读sht40的寄存器之后一定要加10几个ms的延时

    2024年02月12日
    浏览(38)
  • 基于STM32F030驱动MQ7一氧化碳传感器

    了解一氧化碳传感器 MQ7 的驱动原理,通过配置 STM32F030 的GPIO及外设ADC和DMA,采集一氧化碳浓度数据。 MQ-7气体传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(SnO2)。采用高低温循环检测方式低温(1.5v加热)检测一氧化碳,高温(5.0v加热)清洗低温时吸附的

    2023年04月26日
    浏览(50)
  • 电子模块|压力传感器模块HX711---硬件介绍与C51&&STM32驱动

    HX711是一款专为高精度称重传感器而设计的24位A/D转换器芯片。与同类型其它芯片相比,该芯片集成了包括稳压电源、片内时钟振荡器等其它同类型芯片所需要的外围电路,具有集成度高、响应速度快、抗干扰性强等优点。降低了电子秤的整机成本,提高了整机的性能和可靠性

    2024年02月14日
    浏览(56)
  • STM32(HAL库)驱动SHT30温湿度传感器通过串口进行打印

    目录 1、简介 2、CubeMX初始化配置 2.1 基础配置 2.1.1 SYS配置  2.1.2 RCC配置 2.2 软件IIC引脚配置 2.3 串口外设配置  2.4 项目生成  3、KEIL端程序整合 3.1 串口重映射 3.2 SHT30驱动添加 3.3 主函数代 3.4 效果展示 本文通过STM32F103C8T6单片机通过HAL库方式对SHT30传感器进行数据的读取,并

    2024年02月16日
    浏览(40)
  • Clion开发Stm32之温湿度传感器(DS18B20)驱动编写和测试

    涵盖之前文章: Clion开发STM32之HAL库GPIO宏定义封装(最新版) Clion开发stm32之微妙延迟(采用nop指令实现) Clion开发STM32之日志模块(参考RT-Thread) 头文件 源文件

    2024年02月15日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包