蓝桥杯STM32 G431 hal库开发速成——按键+PWM综合案例——按键控制PWM驱动舵机

这篇具有很好参考价值的文章主要介绍了蓝桥杯STM32 G431 hal库开发速成——按键+PWM综合案例——按键控制PWM驱动舵机。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

适用于学习了TIM输出比较(PWM)跟GPIO输入(按键)的新手作为练习的综合项目!

一、PWM的概念

PWM(Pulse Width Modulation,脉冲宽度调制)是一种常用的技术,用于通过调节电信号的脉冲宽度(即脉冲的持续时间)来控制模拟系统的电源。在数字电子系统中,由于只能输出固定的高(通常为 Vcc)或低(通常为 GND)电平,PWM 提供了一种有效的方法来模拟模拟信号。

1.原理
PWM 信号是一种方波,其基本特征是频率和占空比。频率决定了脉冲重复的速度,而占空比是指在一个脉冲周期内,信号为高电平的时间占整个周期的比例。

2.CRR
在 PWM 生成中,CRR 通常用于设置 PWM 的占空比。定时器的总周期由其自身的计数器决定,而 CRR 决定了在这个周期内何时切换输出状态。例如,如果定时器在达到其最大计数值时重置,并且 CRR 设置为这个最大值的一部分,那么输出信号将在计数器值达到 CRR 时切换,从而产生 PWM 信号。
举例
假设一个定时器的计数范围是 0 到 1000(即它的 ARR,自动重载寄存器,设置为 1000)。如果您将 CRR 设置为 500,那么在定时器计数到 500 时会发生一些预设动作(例如,在 PWM 应用中,输出信号可能会从高变低)。这将产生一个 50% 占空比的 PWM 信号。

3.占空比
占空比是 PWM 最重要的特征之一。例如,如果一个 PWM 信号的周期为 10ms,而高电平持续 2ms,则占空比为 20%。调节占空比可以改变平均电压,这是 PWM 控制的基础。

4.应用
电机控制:通过调节占空比,可以精确控制电机的速度。
LED 亮度调节:通过改变驱动 LED 的 PWM 信号的占空比,可以调节 LED 的亮度。
模拟信号生成:通过改变 PWM 信号的平均电压,可以模拟出模拟信号。
电源管理:在开关电源中,PWM 用于控制电源的输出电压。

5.优点
高效率:在高或低电平时,电路中的能量损失较小。
控制精度高:可以非常精确地控制能量输出。
实现简单:在数字电子中易于实现,广泛用于微控制器和其他电子设备。

总而言之,PWM 是一种在数字控制环境中实现有效模拟控制的重要技术,广泛应用于各种电子和电气系统中。

二、PWM常用的函数

1.HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);//使能PWM

2.__HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_2,5000);//修改pulse(CRR)

3.__HAL_TIM_SET_AUTORELOAD(&htim3,10000-1);//修改arr
注:主函数里修改高级定时器的ARR会出现没有效果,需要在cubemx中使能ARR预装载寄存器
stm32g431kill库,蓝桥杯,stm32,单片机,arm开发,mcu,物联网,嵌入式硬件

4.__HAL_TIM_SET_PRESCALER(&htim3, 50-1);//修改psc

三、配置STM32cubeMX

将TIM2的时钟源设置为内部时钟,选择 “PWM Generation CH4”。将PSC设为80,ARR设为20000,CRR(pulse)设为500。

stm32g431kill库,蓝桥杯,stm32,单片机,arm开发,mcu,物联网,嵌入式硬件

stm32g431kill库,蓝桥杯,stm32,单片机,arm开发,mcu,物联网,嵌入式硬件
"PWM Generation CH4"指的是配置定时器(Timer)的第 4 通道(Channel 4)用于产生脉冲宽度调制(PWM)信号。

溢出频率=80M/80/20000=50HZ

溢出时间为1/50=0.02s=20ms

所以就产生了一个周期为20ms的方波,因为ARR设置为20000,所以在一个周期为20ms的时间内计数20000

20000对应20ms,CCR设为500即对应的就是0.5ms,所以高电平在一个周期内持续的时长为0.5ms,占空比=CRR/ARR=500/20000=2.5%。

根据 SG90舵机对应的控制关系(见四、SG90舵机),CCR为500时,转动的角度为0°
设置CCR为500的目的就是让转动的角度初始化为0°

四、SG90舵机

SG90 舵机是一种广泛使用的小型伺服电机,它因其成本效益高、体积小巧以及简单的控制方式而受到业余爱好者和教育领域的青睐。以下是 SG90 舵机的基本介绍:

1.基本特性

尺寸和重量:大约 23mm x 12.2mm x 29mm,重量大约 9 克。

电源要求:通常工作在 4.8V 至 6V 的电压范围内。

转动范围:提供大约 180 度的转动范围。

力矩:在 4.8V 至 6V 的电压下,力矩大约在 1.2 - 1.6 kg·cm。

控制方式:使用标准的脉宽调制(PWM)信号进行控制。

2.接线介绍

SG90 舵机通常有三根线:

橙色/黄色线:控制线(PWM信号线)。这根线连接到微控制器(如 Arduino)的数字输出引脚,用于传输控制信号。

红色线:电源线(正极)。这根线连接到电源的正极,通常是 4.8V 至 6V。本项目中是接5V槽口就可以了

棕色/黑色线:接地线(负极)。这根线连接到电源的负极和微控制器的接地。

3.SG90舵机对应的控制关系

高电平宽度——角度——CRR——占空比
stm32g431kill库,蓝桥杯,stm32,单片机,arm开发,mcu,物联网,嵌入式硬件

五、代码实现

实现效果:每按一次按键B1, 舵机就会旋转30°,直至旋转到180°。大于180°就会重新从零开始。

1.在/* USER CODE BEGIN 0 /与/ USER CODE END 0 */之间增加如下代码

void Servo_SetAngle(float Angle)
{
	__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_4,Angle / 180 * 2000 + 500);
}
int KeyNum=0;

上述代码是用来设置旋转的角度
0° 对应的是 CRR 500



180°对应的是 CRR 2500

所以根据二元一次方程可求得CRR=(Angle / 180) * 2000 + 500

__HAL_TIM_SetCompare();这个函数就是用来设置CRR(pluse)的

2.在key.c中添加如下代码

int Key_GetNum(void)
{
	uint8_t KeyNum=0;
	if (HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==RESET)
	{
		HAL_Delay(20);
		while (HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==RESET);
		HAL_Delay(20);
		KeyNum = 1;
	}
	
	if (HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==RESET)
	{
		HAL_Delay(20);
		while (HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==RESET);
		HAL_Delay(20);
		KeyNum = 2;
	}
	
	if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==RESET)//B3按下为低电平
	{
		HAL_Delay(20);
		while (HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==RESET);
		HAL_Delay(20);
		KeyNum = 3;

	}
	if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==RESET)//B4按下为低电平
	{
		HAL_Delay(20);

		while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==RESET);
		HAL_Delay(20);
		KeyNum = 4;
	}
	return KeyNum;
}

3.在key.h中添加如下代码;

int Key_GetNum(void);

4.在main.c中的int main(void)函数添加如下代码

HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_4);
uint8_t Angle=0;
char angle[50];

5.在while(1)中添加如下代码

	KeyNum=Key_GetNum();
	if(KeyNum==1)
	{
		Angle+=30;
		if (Angle > 180)
		{
			Angle = 0;
		}
		Servo_SetAngle(Angle);
		sprintf(angle,"angle:%d",Angle);
		LCD_DisplayStringLine(Line5,(uint8_t*)angle);
	}

六、遇到的问题

1.如果转动的角度大于180度,则重新回到0度后,在屏幕上显示的是“angle:080”,而正确的显示应该是“angle:0”,这是什么原因呢?

经过查阅资料跟测试我得到了答案

LCD 显示函数的行为:LCD_DisplayStringLine ()这个函数不会自动清除之前显示的内容。如果新的字符串比之前的短,它只会覆盖相应的字符数,而不是整行。

解决方案:

方法 1 - 清除 LCD 行: 在每次调用 LCD_DisplayStringLine 之前,先发送一个空字符串或足够长的空格字符串来清除之前的内容。

LCD_DisplayStringLine(Line5, (uint8_t*)" "); // 清除旧内容

	KeyNum=Key_GetNum();
	if(KeyNum==1)
	{
		Angle+=30;
		if (Angle > 180)
		{
			Angle = 0;
		}
		Servo_SetAngle(Angle);
		LCD_DisplayStringLine(Line5, (uint8_t*)"                        "); // 清除旧内容
		sprintf(angle,"angle:%d",Angle);
		LCD_DisplayStringLine(Line5,(uint8_t*)angle);
	}

方法 2 - 清屏(清除整页): 在每次调用 LCD_DisplayStringLine 之前,使用这行代码:

LCD_Clear(Black); //清屏

方法 3 - 填充空格: 修改 sprintf 使用固定宽度并右对齐,保证生成的字符串总是具有相同的长度。

sprintf(angle, “%3d”, Angle); // 右对齐,总宽度为3

	KeyNum=Key_GetNum();
	if(KeyNum==1)
	{
		Angle+=30;
		if (Angle > 180)
		{
			Angle = 0;
		}
		Servo_SetAngle(Angle);
//		LCD_DisplayStringLine(Line5, (uint8_t*)"                        "); // 清除旧内容
		sprintf(angle, "angle:%3d", Angle);  // 右对齐,总宽度为3
		LCD_DisplayStringLine(Line5,(uint8_t*)angle);
	}

2.如果写从第六个字符开始显示的话,则

LCD_DisplayStringLine(Line5,(uint8_t*)angle+6);

3.将电源线插在3v3槽口中,为什么PWM波无法控制SG90舵机的驱动呢?

SG90 舵机通常需要 4.8V 至 6V 的电压才能正常工作。3.3V 的电压不足以激活舵机的内部电路,导致无法正常响应 PWM 信号。

解决方案:
将电源线插到5V的槽口就行了文章来源地址https://www.toymoban.com/news/detail-810723.html

到了这里,关于蓝桥杯STM32 G431 hal库开发速成——按键+PWM综合案例——按键控制PWM驱动舵机的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【蓝桥杯】一文解决蓝桥杯嵌入式开发板(STM32G431RBT6)LCD与LED显示冲突问题,并讲述LCD翻转显示

       不知道大家在开发过程中有没有碰到: LCD与LED同时(宏观上的同时)点亮时产生的LED状态紊乱问题 。 LCD与LED显示冲突现象图   为了解决上述问题,小编给出了以下三种解决方案: 方案一:    每次LCD显示完成数据后,关闭所有LED一次。   但是 使用该方法比较麻烦,

    2023年04月12日
    浏览(51)
  • 蓝桥杯电子类嵌入式(STM32G431)备赛学习记录(一)——LED

    2023年2月10日,距离第十四届蓝桥杯正式比赛还有不到两个月的样子,从今天开始正式备赛。之前博主有看过野火的教程,学的是STM32F103。蓝桥杯嵌入式组现在用的是STM32G431,板子在二手平台上买的,视频参考b站up主01Studio相关教程(后面提到简写为教程)。学习的模块按照教

    2024年01月25日
    浏览(71)
  • 蓝桥杯嵌入式STM32G431RBT6竞赛指南与模板——最后的绝唱

    谨以此文和我去年前的一篇蓝桥杯单片机的教程构成电子类的 青铜双壁. 国信长天单片机竞赛训练之原理图讲解及常用外设原理(遗失的章节-零)_昊月光华的博客-CSDN博客     目录 时钟树 串口重定向:printf输出 动态点灯(点灯大师) 按键(常用状态机) 同一时刻对多个按键按

    2024年02月07日
    浏览(51)
  • [蓝桥杯嵌入式]STM32G431——第十二届第一场省赛停车计费系统真题及程序设计代码详解

    最近,我报名了今年的蓝桥杯嵌入式比赛,为此刷了一下以往的真题。以下是我对十二届蓝桥杯省赛真题的一些思路和心得,还有一些具体代码的实现。 1、相关模块 第十二届比赛主要用到的模块包括:LED、KEY、LCD、TIM、USART 2、重难点分析 这道题主要目的是做一个停车管理

    2024年01月18日
    浏览(96)
  • STM32G431RB--基于HAL库(蓝桥杯嵌入式赛前梳理)

    明天就进行蓝桥杯的比赛了,最后一天再重新梳理一下各个模块的使用和代码的编写。 如果各个模块的MX配置是根据我之前发的来的,那么这篇文章中的代码完全适用;如不是,原理部分也是相同的,代码部分适用,可以自行判断,作为一个参考。 引脚: 1.控制LED灯亮灭时需

    2023年04月08日
    浏览(96)
  • STM32 G431

    1.家族 STM32:32代表32位MCU,有32根地址线,可以寻找4GB的地址 STC15单片机是8位CPU,地址以16进制表示:0x_ _ ; STM32: 0x_ _ _ _ _ _ _ _ 容量为 2^32 = 4,294,967,296 ≈ 4×10^9 (其中 1GB = 10^9) 2.产品类别 G: 支持DSP和FPU指令的可适用信号应用 像正点原子的F4,F:基础型,通用型 3.特点功能 103

    2024年02月03日
    浏览(53)
  • STM32G431RBT6移植FreeRTOS

    引言: 本文专门为参加了蓝桥杯嵌入式赛道的同学准备, 大家可能会有这样一个问题, 比完赛之后, 对于像继续使用STM32G431RBT6学习FreeRTOS的, 发现网上的教程使用的板子基本上都是F1和F4的, 其实呢, 随便移植一下就能在我们自己的板子上面运行FreeTROS了。如果大家有AR

    2024年04月23日
    浏览(67)
  • 关于STM32G431RBT6的学习

    初入茅庐之第一次CubeMX的使用,工程结构框架的创建与LED的点亮。 温馨提示:本人第一次创作,也是第一次学习有关嵌入式的知识,本文内容均为个人见解,如有错误,欢迎指正。 首先打开STM32CubeMX,创建一个新的工程,点击File→New Project。 在Part Number中直接搜索STM32G431RB。

    2024年01月21日
    浏览(43)
  • 解决keil5无法生成axf文件(国信长天STM32G431R8)

    我安装了keil5和STM32cubemx,这两个软件都是从官网下载,速度挺快的,参考博文如下: 【STM32】STM32 CubeMx使用教程一--安装教程_Z小旋的博客-CSDN博客 这里需要注意的就是Java版本一定要选对,我一般的处理方式就是全都 下载最新 的,基本上就不会出错。  Keil

    2024年02月05日
    浏览(56)
  • 按键调整PWM占空比,实现电机转速调整(基于STM32开发板)

    实验名称 :PWM控制电机转速 实验功能 : 基于正点原子战舰开发板,通过按键(KEY0 / KEY1)改变PWM,进而实现电机转速的调整。当按下KEY0键,电机转速加快;按下KEY1键,电机转速降低。 硬件资源 : 1. 独立按键 KEY0         -  PE4 KEY1         -  PE3 2. 通用定时器 TIM2

    2024年02月09日
    浏览(46)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包