STM32C8T6控制智能小车代码

这篇具有很好参考价值的文章主要介绍了STM32C8T6控制智能小车代码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本程序是在keil5软件下使用标准库编程的,纯自己手打,包含详细的代码注释。

首先就是PWM模块,次模块用于改变小车的转速,本项目用一个L98N电机驱动模块,将左边的两个轮子连接在一个L98N电机驱动模块输出引脚,将坐标的两个轮子连接在L298N的另外一个输出引脚,由此控制四个轮子的转动。

下面是PWM模块的代码

PWM.c

#include "stm32f10x.h"                  // Device header

//用两个定时器产生PWM波形,分别控制两侧电机
//PA6、PA7、PA8、PA9四个引脚分别产生四个PWM波形控制左轮前进调速、左轮后退调速、右轮前进调速、右轮后退调速
//其中轮子的前进和后退输出的PWM波形必须相同

//初始化TIM1时钟,控制PA8、PA9上的电机,也就是右侧电机
void TIM1_PWM_Init(void)
{
	//RCC开启时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9;	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;// 复用推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	//配置时基单元
	TIM_InternalClockConfig(TIM1);
	//配置时基单元//初始化时基单元
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
	TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
	TIM_TimeBaseInitStruct.TIM_Period=100-1;//ARR//自动重装值,当到100时执行一次中断
	TIM_TimeBaseInitStruct.TIM_Prescaler=720-1;//PSC//将72HMZ分为720份
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;
	TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStruct);
	
	
	//配置输出比较单元
	TIM_OCInitTypeDef TIM_OCInitStruct;
	TIM_OCStructInit(&TIM_OCInitStruct);//给结构体变量赋初始值
	TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;//设置输出比较模式
	TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High;//设置输出比较极性
	TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;//设置输出使能
	TIM_OCInitStruct.TIM_Pulse=0;//设置CCR
	//ARR=100-1,PSC=720-1,CCR=50。此时就是频率为1KHz,占空比为50%的PWM波形
	TIM_OC1Init(TIM1,&TIM_OCInitStruct);
	TIM_OC2Init(TIM1,&TIM_OCInitStruct);
	TIM_ARRPreloadConfig(TIM1,ENABLE);								   // 使能TIM1的自动重装载寄存器
	TIM_CtrlPWMOutputs(TIM1,ENABLE);								// 主输出使能
	TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  				// 使能TIM1在OC1上的预装载寄存器
	TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);				// 使能TIM1在OC2上的预装载寄存器	
	//运行控制,启动计数器
	TIM_Cmd(TIM1,ENABLE);
}


//初始化TIM3时钟,控制PA6、PA7上的电机,也就是左侧电机
void TIM3_PWM_Init(void)
{
	//RCC开启时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;// 复用推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);							
	//配置时基单元
	TIM_InternalClockConfig(TIM3);
	//配置时基单元//初始化时基单元
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
	TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
	TIM_TimeBaseInitStruct.TIM_Period=100-1;//ARR//自动重装值,当到100时执行一次中断
	TIM_TimeBaseInitStruct.TIM_Prescaler=720-1;//PSC//将72HMZ分为720份
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);
	
	
	//配置输出比较单元
	TIM_OCInitTypeDef TIM_OCInitStruct;
	TIM_OCStructInit(&TIM_OCInitStruct);//给结构体变量赋初始值
	TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;//设置输出比较模式
	TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High;//设置输出比较极性
	TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;//设置输出使能
	TIM_OCInitStruct.TIM_Pulse=0;//设置CCR
	//ARR=100-1,PSC=720-1,CCR=50。此时就是频率为1KHz,占空比为50%的PWM波形
	TIM_OC1Init(TIM3,&TIM_OCInitStruct);
	TIM_OC2Init(TIM3,&TIM_OCInitStruct);
	TIM_ARRPreloadConfig(TIM3,ENABLE);								   // 使能TIM1的自动重装载寄存器
	TIM_CtrlPWMOutputs(TIM3,ENABLE);								// 主输出使能
	TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);  				// 使能TIM1在OC1上的预装载寄存器
	TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);				// 使能TIM1在OC2上的预装载寄存器	
	//运行控制,启动计数器
	TIM_Cmd(TIM3,ENABLE);
}

PWM.h

#ifndef __PWM_H
#define __PWM_H
#include "stm32f10x.h" 

void TIM1_PWM_Init(void);//初始化TIM1时钟,控制PA8、PA9上的电机,也就是右侧电机
void TIM3_PWM_Init(void);//初始化TIM3时钟,控制PA6、PA7上的电机,也就是左侧电机


#endif

接下来是电机控制的代码

Motor.c

#include "stm32f10x.h"                  // Device header
#include "PWM.h"

//电机初始化
void Motor_Init(void)
{
	TIM1_PWM_Init();
	TIM3_PWM_Init();
}

//设置左轮的速度
void Motor_SetLeftSpeed(int8_t Speed)
{
	if(Speed>0)//前进
	{	
		GPIO_SetBits(GPIOA,GPIO_Pin_6);//产生PWM波形
		GPIO_ResetBits(GPIOA,GPIO_Pin_7);
		TIM_SetCompare1(TIM3,Speed);//PA6连接TIM3_CH1通道
	}
	else if(Speed==0)//停止
	{
		GPIO_SetBits(GPIOA,GPIO_Pin_7);
		GPIO_SetBits(GPIOA,GPIO_Pin_6);
	}
	else //后退
	{
		GPIO_SetBits(GPIOA,GPIO_Pin_7);//产生PWM波形
		GPIO_ResetBits(GPIOA,GPIO_Pin_6);
		TIM_SetCompare2(TIM3,-Speed);//PA7连接TIM3_CH2通道
	}
}

//设置右轮的速度
void Motor_SetRightSpeed(int8_t Speed)
{
	if(Speed>0)//前进
	{	
		GPIO_SetBits(GPIOA,GPIO_Pin_8);//产生PWM波形
		GPIO_ResetBits(GPIOA,GPIO_Pin_9);
		TIM_SetCompare1(TIM1,Speed);//PA8连接TIM1_CH1通道
	}
	else if(Speed==0)//停止
	{
		GPIO_SetBits(GPIOA,GPIO_Pin_8);
		GPIO_SetBits(GPIOA,GPIO_Pin_9);
	}
	else //后退
	{
		GPIO_SetBits(GPIOA,GPIO_Pin_9);//产生PWM波形
		GPIO_ResetBits(GPIOA,GPIO_Pin_8);
		TIM_SetCompare2(TIM1,-Speed);//PA9连接TIM1_CH2通道
	}
}

Motor.h

#ifndef __MOTOR_H
#define __MOTOR_H
#include "stm32f10x.h" 

void Motor_Init(void);//电机初始化
void Motor_SetLeftSpeed(int8_t Speed);//设置左轮的速度//Speed>0前进,<0后退
void Motor_SetRightSpeed(int8_t Speed);//设置右轮的速度//Speed>0前进,<0后退

#endif

接下来是控制小车模块的代码

Car.c

#include "stm32f10x.h"                  // Device header
#include "PWM.h"
#include "Motor.h"
#include "Delay.h"

//小车初始化
void Car_Init(void)
{
	Motor_Init();
}

//前进调速
void Go_Ahead(int8_t Speed)
{
	Motor_SetLeftSpeed(-Speed);
	Motor_SetRightSpeed(-Speed);
}

//后退调速
void Go_Back(int8_t Speed)
{
	Motor_SetLeftSpeed(Speed);
	Motor_SetRightSpeed(Speed);
}

//右转
void Turn_Left(void)
{
	Motor_SetLeftSpeed(-40);
	Motor_SetRightSpeed(80);
}

//左转
void Turn_Right(void)
{
	Motor_SetLeftSpeed(80);
	Motor_SetRightSpeed(-40);
}

//停止
void Car_stop(void)
{
	Motor_SetLeftSpeed(0);
	Motor_SetRightSpeed(0);
}

Car.h

#ifndef __CAR_H
#define __CAR_H
#include "stm32f10x.h" 

void Car_Init(void);//小车初始化
void Go_Ahead(int8_t Speed);//前进调速//Speed>0前进,<0后退
void Go_Back(int8_t Speed);//后退调速//Speed>0前进,<0后退
void Turn_Left(void);//右转
void Turn_Right(void);//左转
void Car_stop(void);//停止

#endif

本项目可以使用蓝牙控制小车的前进后退转弯等,接下来是蓝牙模块的代码

lanya.c

#include "stm32f10x.h"                  // Device header
#include <stdio.h>
#include <stdarg.h>

uint8_t Serial_RXData;//定义一个变量,用于存储接收的数据
uint8_t Serila_RXFlag;//接收变量标志位


void Serial_Init(void)
{
	//开启时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	//GPIO初始化
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;//初始化PA9引脚,用于串口发送//32的发送端//电脑的接收端
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//初始化PA10引脚,用于串口接收//32的接收端//电脑的发送端
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	//配置USART
	USART_InitTypeDef USART_InitStruct;
	USART_InitStruct.USART_BaudRate=9600;//波特率
	USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_RTS;//硬件流控制//不需要控制流
	USART_InitStruct.USART_Mode=USART_Mode_Tx | USART_Mode_Rx;//发送+接收模式
	USART_InitStruct.USART_Parity=USART_Parity_No;//不需要校验位
	USART_InitStruct.USART_StopBits=USART_StopBits_1;//停止位//1位停止位
	USART_InitStruct.USART_WordLength=USART_WordLength_8b;//选择八位字长
	USART_Init(USART2,&USART_InitStruct);
	//开启中断
	USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);//开启RXNE标志位到NVIC的输出
	//配置NVIC
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	//初始化NVIC的USART1通道
	NVIC_InitTypeDef NVIC_InitStruct;
	NVIC_InitStruct.NVIC_IRQChannel=USART2_IRQn;
	NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;
	NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;
	NVIC_Init(&NVIC_InitStruct);
	//开启USART
	USART_Cmd(USART2,ENABLE);
}

//发送字节
void Seral_SendByte(uint8_t Byte)
{
	USART_SendData(USART2,Byte);//将串口的数据发送到电脑上
	while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);//等待传输完成
}

//发送数组
void Seril_SendArray(uint8_t *Array,uint16_t Length)
{
	uint16_t i;
	for(i=0;i<Length;i++)
	{
		Seral_SendByte(Array[i]);//通过for循环一位一位的发送数组中的数据
	}
}

//发送字符串
void Seril_SendString(char *String)
{
	uint8_t i;
	for(i=0;String[i]!='\0';i++)
	{
		Seral_SendByte(String[i]);//通过for循环一位一位的发送数组中的数据
	}
}

uint32_t Seril_Pow(uint32_t X,uint32_t Y)
{
	uint32_t Result=1;
	while(Y--)
	{
		Result*=X;
	}
	return Result;
}

//发送数字
void Seril_SendNumber(uint32_t Number,uint8_t Length)
{
	uint8_t i;
	for(i=0;i<Length;i++)
	{
		Seral_SendByte(Number/Seril_Pow(10,Length-i-1)%10+'0');
	}
}

int fputc(int ch,FILE *f)//将fputc函数重定向到串口
{
	Seral_SendByte(ch);
	return ch;
}

//打印
void Serial_Printf(char *format, ...)
{
	char String[100];
	va_list arg;
	va_start(arg, format);
	vsprintf(String, format, arg);
	va_end(arg);
	Seril_SendString(String);
}


//清除标志位函数,自动清除标志位
uint8_t Serial_GetRxFlag(void)
{
	if(Serila_RXFlag==1)//如果接收标志位为1,则清除接收标志位,并且函数返回1
	{
		Serila_RXFlag=0;
		return 1;
	}
	return 0;
}

//这个函数用于返回接收到的数据
uint8_t Serial_GetRxData(void)
{
	return Serial_RXData;
}

//中断函数
void USART2_IRQHandler(void)
{
	if(USART_GetITStatus(USART2,USART_IT_RXNE)==SET)//如果这个函数为1,说明接收数据的发生
	{
		Serial_RXData=USART_ReceiveData(USART2);//将数据存储在变量Serial_RXData中
		Serila_RXFlag=1;//接收标志位置1
		USART_ClearITPendingBit(USART2,USART_IT_RXNE);//清除接收标志位
	}
}

lanya.h

#ifndef __LANYA_H
#define __LANYA_H
#include "stm32f10x.h"
#include <stdio.h>

void Serial_Init(void);
void Seral_SendByte(uint8_t Byte);
void Seril_SendArray(uint8_t *Array,uint16_t Length);
void Seril_SendString(char *String);
void Seril_SendNumber(uint32_t Number,uint8_t Length);
void Serial_Printf(char *format, ...);
uint8_t Serial_GetRxFlag(void);
uint8_t Serial_GetRxData(void);


#endif

最后就是主函数了

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "Car.h"
#include "lanya.h"
#include "OLED.h"



uint8_t Date;//定义一个变量,用于存储接收的数据、
uint8_t Go_Ahead_flag=0;//0表示没有前进,1前进50,2前进100
uint8_t Go_Back_flag=0;//0表示没有前进,1前进50,2前进100

int main(void)
{
	Car_Init();//初始化小车
	Serial_Init();//初始化蓝牙串口
	OLED_Init();//初始化OLED
	
	OLED_ShowString(1,4,"Car control");
	OLED_ShowString(2,1,"Data:");
	OLED_ShowString(3,1,"Command:");
	OLED_ShowString(4,1,"Speed:");
	
	while (1)
	{		
		if(Serial_GetRxFlag()==1)//如果Serial_GetRxFlag()返回值是1说明有数据接收的发生
		{
			Date=Serial_GetRxData();//将接收到的数据传到变量RxDate中
			OLED_ShowHexNum(2,9,Date,2);//在OLED上显示接收到的数据
			
			if(Date==02)//前进
			{
				Car_Init();
				Seril_SendString("Go_Ahead");//将对应的命令返回到手机上
				OLED_ShowString(3,9,"Go_Ahead");//将对应的命令在怕屏幕上显示
				OLED_ShowNum(4,9,50,2);
				Go_Ahead(100);//前进50
			}	
			if(Date==00)//后退
			{
				Car_Init();
				Seril_SendString("Go_Back");//将对应的命令返回到手机上
				OLED_ShowString(3,9,"Go_Back");//将对应的命令在怕屏幕上显示
				OLED_ShowNum(4,9,50,2);
				Go_Back(50);//后退50
			}
			if(Date==06)//右转
			{
				Car_Init();
				Seril_SendString("TurnRight");//将对应的命令返回到手机上
				OLED_ShowString(3,9,"TurnRight");//将对应的命令在怕屏幕上显示
				Turn_Right();
				OLED_ShowNum(4,9,00,2);
			}	
			if(Date==04)//左转
			{
				Car_Init();
				Seril_SendString("TurnLeft");//将对应的命令返回到手机上
				OLED_ShowString(3,9,"TurnLeft");//将对应的命令在怕屏幕上显示
				Turn_Left();
				OLED_ShowNum(4,9,00,2);
			}
			if(Date==07)//停止
			{
				Car_Init();
				Seril_SendString("Car_stop");//将对应的命令返回到手机上
				OLED_ShowString(3,9,"Car_stop");//将对应的命令在怕屏幕上显示
				Car_stop();//停止
				OLED_ShowNum(4,9,00,2);
			}
		}
	}
}

使用蓝牙调试软件(各大手机应用商店都有下载),连接蓝牙模块后,想蓝牙模块发送相应代码,小车就可以执行相应的命令。

到此本项目就暂时分享完了,如果需要完成的工程软件评论我,我发给你。

PS:本人熟悉51单片机与STM32的操作与使用,如有关于单片机(51、STM32)的作业、课设、毕业设计皆可询问本人。文章来源地址https://www.toymoban.com/news/detail-754006.html

到了这里,关于STM32C8T6控制智能小车代码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • STM32F103C8T6智能小车舵机超声波避障

    目录 一、定时器 计数和定时器中断  输出比较(PWM) 二、 舵机 三、超声波测距 四、主函数 总结 推荐的STM32学习链接:  [6-1] TIM定时中断_哔哩哔哩_bilibili [6-1] TIM定时中断是STM32入门教程-2022持续更新中的第13集视频,该合集共计29集,视频收藏或关注UP主,及时了解更多相关视

    2024年02月15日
    浏览(45)
  • STM32C8t6 驱动激光雷达实战(二)

    数据格式为:角度(°):距离(mm)。 STM32C8t6驱动激光雷达 前面我们了解了激光雷达的原理,下面用C8T6驱动激光雷达 激光雷达一共有 6 个引脚,其中 2 个 GND,2 个 5V,一对 RX 和 TX 引脚, 按照下表 1-1 的接线要求接在 STM32 单片机上。其中 2 个 5V 因为电流要求, 可以接在

    2024年02月02日
    浏览(42)
  • STM32学习笔记(三)端口复用与重映射(stm32c8t6)

    记录一下学习过程 1.端口复用 STM32有很多内置外设,这些外设的外部引脚是与GPIO复用的。默认情况下,这些GPIO口只能作为普通的IO口输入输出,把一个GPIO口的引脚复用为内置外设的功能引脚,通过这些GPIO口就可以使用内置外设了,这个过程叫做复用。但不是每一个引脚都用

    2023年04月27日
    浏览(41)
  • 学习笔记——STM32C8T6如何配置普通IO口

     最近使用stm32f103c8t6时,想要使用PA15端口作为普通io口输出电平信号,但是发现配置不生效,于是就去网上查,发现要关闭初始状态下芯片默认的专用复位功能,于是总结了一下几个配置普通io口的引脚: 有: PA13  PA14  PA15  PB3  PB4 同时,这些引脚主功能(复位后)的功能

    2024年02月02日
    浏览(46)
  • STM32学习笔记(五)串口空闲中断+DMA实现不定长收发(stm32c8t6)

    记录一下学习过程 DMA DMA,全称为: Direct Memory Access,即直接存储器访问, DMA 传输将数据从一个 地址空间复制到另外一个地址空间。 这一过程无需cpu的参与,从而提高cpu使用的效率 DMA相关的参数:1 数据的源地址、2 数据传输的目标地址 、3 传输宽度,4 传输多少字节,5 传

    2024年02月14日
    浏览(43)
  • 【基于STM32F103C8T6的智能风扇控制】

    本次分享的是基于STM32F103的智能风扇的制作,相关的硬件和部分源码可看下面哦,需要成品的可私(创作不易,拒绝白嫖) 喜欢就给小殷一个关注和点赞吧 演示视频链接 1、按键模式下通过按键进行风扇档数改变一共设置为4档 2、自动模式下根据环境温度而改变温度的转速和

    2024年02月12日
    浏览(85)
  • 使用stm32c8t6和mpu6050制作一台穿越机

    介绍:使用stm32c8t6和mpu6050制作一款低价飞控,固件用的是开源的betaflight_3.2.5_NAZE,飞行噪声很小,可能是桨叶好,乾丰5寸3叶桨。 原理图: PCB: 拿到嘉立创打样后: 焊接: 飞控需要单独5v供电,随便找了各降压模块,某宝大概3元钱,插入3s电池,调节旋钮,电源稳压到5v,

    2024年02月02日
    浏览(35)
  • STM32C8T6I2C驱动OLED显示汉字版本(江科大基础改编)

    最近突然想显示汉字,然后翻了一圈发现版本好多,所以就挑了一个合适的。然后我的目的主要是驱动OLED0.96寸显示汉字,所以很简单,就是先配置驱动的模型库 在font.h添加这一段库,直接在代码下面添加即可。然后如果想要自己取模就下载PctolLCD2002这个取模软件,搜索百度

    2024年02月10日
    浏览(85)
  • 实现语音识别系统:手把手教你使用STM32C8T6和LD3320(SPI通信版)实现语音识别

            本文实际是对LD3320(SPI通信版)的个人理解,如果单论代码和开发板的资料而言,其实当你购买LD3320的时候,卖家已然提供了很多资料。我在大学期间曾经多次使用LD3320芯片的开发板用于设计系统,我在我的毕业设计作品中也有添加这个系统功能,用于添加整个系

    2024年02月06日
    浏览(40)
  • 基于STM32f103c8t6的简单红外巡迹避障小车制作

    (1)电源 电源模块选用的是18650锂电池(充电器及电池底座)、3.3v稳压模块。 (2)车模 淘宝最常见的智能车底。 (3)电机 买的智能车带有四个电机,选用L298N电机驱动板对电机进行驱动。 (4)巡迹及避障 巡迹选用四路红外模块实现,避障选用超声波模块HC-SR04实现。 (

    2023年04月15日
    浏览(43)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包