基于STM32G431嵌入式学习笔记——八、PWM脉冲输出(基于第12届蓝桥杯节选PA7作引脚)

10 篇文章 11 订阅
8 篇文章 0 订阅
一、真题引入

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

简言之,关于脉冲输出的题目要求如下:
①默认低电平
②按下key4,切换低电平/脉冲信号
③输出脉冲器件LED2点亮,否则熄灭。

二、基础知识
1.PWM工作原理

在这里插入图片描述

2.与时钟信号的关联

具体可以查阅STM32G4系列微控制器参考手册
在这里插入图片描述28-31章均为时钟timer相关资料,我们可以向右方一样查找该类型定时器是否支持PWM,从而判断该定时器是否能调用引脚实现脉冲输出。【实际上只有第31章的定时器不支持PWM输出功能】
对于我们用户来说,各种输出都是来自于引脚,因此PWM的配置本质依旧是引脚配置

3.生活中的PWM

我们的可变亮度的台灯本质是利用了PWM输出,通过调节占空比,实现不同占空比下不同平均电压的输出,从而有了灭->暗->亮->晃眼睛。

三、PWM在CubeXM中的配置

该部分是第12届蓝桥杯最后一部分的题目内容,因此我们可以基于第六节的环境进行修改。

如何在CubeMX中判断哪些定时器支持PWM?
如图所示,众多的定时器channel中可以选择功能,仅需检查是否有PWM选项
在这里插入图片描述
但是本题对引脚做出了限制
在这里插入图片描述
因此选择PA7进行配置

在这里插入图片描述

实际上PWM是多路输出的,因此在定时器中会有许多通道,而我们仅需要选择其中一个channel即可,且实际上上面四个通道任选其一均可
如果题目没有指定某引脚,我们平时练习可以只固定一个熟练的引脚一直使用(我固定使用PA7的通道2)

①记得在该通道选定PWM generation
②配置时钟源(internal clock内部时钟)
在这里插入图片描述

操作实现了2K的输出频率
具体计算如下:
时钟频率: 80 M H z = 8 ∗ 1 0 7 H z 80MHz=8*10^7Hz 80MHz=8107Hz
预分频器分频: 8 ∗ 1 0 7 H z / 80 = 1 0 6 H z 8*10^7Hz/80=10^6Hz 8107Hz/80=106Hz
利用计数周期分频: 1 0 6 H z / 500 = 2 ∗ 1 0 3 H z = 2 K H z 10^6Hz/500=2*10^3Hz=2KHz 106Hz/500=2103Hz=2KHz

Prescaler:预分频器
Counter Period:计数周期,指计数多少次发生一次中断

在这里插入图片描述操作实现占空比20%
上述Counter Period为一个周期计数500,那么占空比20%
说明要计数 500 ∗ 20 % = 100 500*20\%=100 50020%=100即100脉冲
在这里插入图片描述
在这里还有一个关于Mode的知识点,PWM的两种模式代表不同情况
在这里插入图片描述

在进行PWM信号输出时,有两种PWM模式:PWM1模式和PWM2模式。
这两种PWM模式和输出有效电平的极性共同决定了PWM信号的波形。
PWM1模式
递增计数时,当TIMx_CNT(计数值)< TIMx_CCR(捕获/比较值)时,输出为有效电平,否则为无效电平。递减计数模式则刚好相反。
PWM2模式
递增计数时,当TIMx_CNT(计数值)< TIMx_CCR(捕获/比较值)时,输出为无效电平,否则为有效电平。递减计数模式则刚好相反。

下面我们详细分析一下两种PWM模式的区别:
假设定时器设置为递增计数模式,输出有效电平的极性为高电平。
PWM1模式下的CCR用于控制高电平持续的时间;
PWM2模式下的CCR用于控制低电平持续的时间,两种模式下的PWM信号互为互补输出。 在这里插入图片描述
环境配置完毕

四、代码书写
1.将代码对比恢复至第六节最后的内容

(1)头文件补充
(2)全局变量有没有遗漏
(3)函数声明
(4)主函数

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  MX_TIM3_Init();
  /* USER CODE BEGIN 2 */
  LCD_Init();
  control_led(LEDALL,OFF);
	ParkingInit();
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
	HAL_UART_Receive_IT(&huart1, (uint8_t *)usart_rx,RxLen);
  LCD_Clear(Black);
  while (1)
  {
    /* USER CODE END WHILE */
    lcd_proc();
    key_proc();
    led_proc();
    busi_proc();
    /* USER CODE BEGIN 3 */

  }
  /* USER CODE END 3 */
}
2.更新全局变量

在这里插入图片描述

3.更新按键函数
void key_proc(void)
{
  char value = key_scan();
  switch(value)
  {
    case 1:
      /*切换LCD显示屏界面的操作*/
      lcd_flag = (lcd_flag == 1 ? 0 : 1);
      lcd_update_flag=1;
      break;
    case 2:
      /*CNBR、VNBR费率增加0.5�??*/
      cnbr += 0.5f;
      vnbr += 0.5f;
      lcd_update_flag=1;
      break;
    case 3:
      /*CNBR、VNBR费率减少0.5�??*/
      cnbr -= 0.5f;
      vnbr -= 0.5f;
      lcd_update_flag=1;
      break;
    case 4:
      /*两种频率输出状态*/
      pwm_flag = (lcd_flag == 1 ? 0 : 1);
      break;
  }
}
4.书写pwm函数
void pwm_proc(void)
{
  if(pwm_flag)//低电平
  {
    HAL_TIM_PWM_Stop(&htim3,TIM_CHANNEL_2);
    HAL_Delay(5);
  }
  else//高电平
  {
    HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);
    HAL_Delay(5);
  }
}

记得在整个文件开头进行函数声明:
在这里插入图片描述
代码中有两个函数,分别代表停止/开始PWM输出
开始输出的时候就是20%占空比2KHz,停止输出后便为低电平
在这里插入图片描述
两个函数位于如下图所示的位置
在这里插入图片描述
拓展:该函数的另一种实现方式

void pwm_proc(void)
{
  if(pwm_flag)//低电平
  {
    HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);
    __HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_2,0);//占空比0
    HAL_Delay(5);
  }
  else//高电平
  {
    HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);
    __HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_2,100);//占空比100/500=20%
    HAL_Delay(5);
  }
}

__HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_2,100) 是专门用来设置占空比的函数
最后一个参数的含义为我们的计数周期中有多少计数是脉冲
我们曾在CubeMX中设置计数周期为500,则500*0.2=100

在这里插入图片描述
对于这两种方式,我们都需要记住!!第二种方法尤为重要,通过这个甚至可以设计出我们生活中的可调亮度台灯

5.重写led函数
void led_proc(void)
{
  if(idle>0)
  {
    control_led(LED1,ON);//LED1�??
  }
  else
  {
    control_led(LED1,OFF);
  }
	if(pwm_flag==1)
		control_led(LED2,ON);
	else
		control_led(LED2,OFF);
}
6.书写主函数

实际上仅需在while循环中新增一行pwm_proc()即可
在这里插入图片描述

保存,编译,下载,观察不同按键下的板子状态。
至此第12届蓝桥杯省赛题目所有任务均完成,后续会更新一期完整的第12届蓝桥杯题目整体思路和流程

具体操要求如下: 以给定频率输出脉冲脉冲数无限制 以给定频率f、输出n个脉冲 相对定位 相对定位+绝对定位 脉冲输出PORTA.0 方向信号输出PORTB.5 模仿PLC定位指令 可以为简易运动控制器控制伺服电机 发脉冲两种目的 1)速度控制 2)位置控制 速度控制目的和模拟量一样,没有什么需要关注的地方 发送脉冲方式为PWM,速率稳定而且资源占用少 stm32位置控制需要获得发送的脉冲数,有下面4种手段 1)每发送一个脉冲,做一次中断计数 2)根据发送的频率×发送的时间,获得脉冲数量,对于变速的脉冲,可以累计积分的方法来获得总脉冲 3)一个定时器为主发送脉冲,另外一个定时器为从,对发送的脉冲计数 4)使用DMA方式,例如共发送1000个脉冲,那么定义u16 per[1001],每发送一个脉冲,dma会从数组中更新下一个占空比字,数组最后一个字为0,表示停发脉冲 上面4种方法的用途和特点 1)对于低速率脉冲比较好,可以说低速发脉冲的首选,例如10Khz以下的,否则中断占用太多的cpu,这种方法要注意将中断优先级提高,否则会丢计数, 2)用定时的计时精确高,可以允许有脉冲计数丢失的情况 3)主从方式,需额外的定时器来计数,例如tim1发脉冲 tim2计数,最方便的方式,无论高速低速即可,同时占用cpu最低,只是要占用多一个定时器 4)DMA方式也算是一个很确定的方式,不会丢失脉冲,但是高速的时候,会较多的占用内部总线同时会使用一个多余的DMA控制器,而且有个缺点,就是使用起来比较复杂,没有达到KISS原则 个人推荐方式,低速时中断方式,如果不知高速还是低速,则使用主从方式。具体的方式需要根据资源和需求来确定。 stm32定时器算是比较复杂的器件,而且用户要较多的介入底层,希望将来st公司能够能够简化器件的使用。
### 回答1: 蓝桥杯是全国性的计算机大赛,旨在提高大学生的计算机技术水平和创新能力。嵌入式STM32G431是一款嵌入式芯片,具有高性能和低功耗的特点。第十二第一场省赛停车计费系统是蓝桥杯的一道工程题目,要求参赛选手设计一个停车场计费系统。 停车计费系统是指通过嵌入式技术实现对车辆进入和离开停车场的自动检测、计时和计费的系统。对于这个题目,参赛选手可以根据题目要求,使用STM32G431芯片设计一个具有以下功能的系统: 1. 车辆进入检测:使用车辆传感器检测车辆的进入,触发计时。 2. 车辆离开检测:使用车辆传感器检测车辆的离开,停止计时。 3. 计时功能:使用内部时钟模块获取进入和离开的时间,并计算停车时间。 4. 计费功能:根据停车时间,按照一定的计费规则进行计费。 5. 显示功能:使用液晶显示屏显示当前的停车信息,如车牌号、停车时间、费用等。 6. 数据存储功能:使用闪存等储存介质将停车数据进行存储,以便后续的数据分析和查询。 设计一个停车计费系统涉及到硬件设计和软件编程两个方面。硬件方面,参赛选手需要选择合适的传感器、显示屏、存储介质等,以及设计电路和接口进行连接。软件方面,需要使用C语言或者汇编语言编写程序,对芯片进行编程,实现各项功能。 通过此次比赛,选手们可以锻炼嵌入式系统的设计能力和编程能力,了解实际应用中嵌入式系统的工原理和应用场景。同时,也能提升对STM32G431芯片的理解和运用能力。这对于培养嵌入式技术人才,推动物联网技术的发展都具有积极意义。 ### 回答2: 蓝桥杯是面向计算机爱好者的智力竞赛,而嵌入式STM32G431是一款嵌入式系统开发板。第十二第一场省赛的停车计费系统真题工程,则是要求参赛选手设计并实现一个能够进行停车计费的系统。 停车计费系统是一种用于自动计费和管理停车场的系统。这个系统可以通过识别车辆的进出以及停车的时间,自动计算并收费。在这个工程中,选手需要使用嵌入式STM32G431开发板以及相关的硬件和软件,来设计一个能够实现停车计费功能的系统。 首先,选手需要使用传感器或摄像头来实现车辆进出的检测。当车辆进入或离开停车场时,传感器会发出信号并通过STM32G431进行检测。接着,选手需要编程实现识别车辆的算法,以便能够识别不同的车辆。当车辆停放时,系统会通过计时器记录停车的时间。 然后,选手需要编写计费算法,根据停车的时间来计算费用。这个算法可以根据停车场的规则来确定费用的计算方式,例如按小时计费或按照不同的时间段采用不同的费率。 最后,选手还需要设计一个界面,使得系统能够与用户进行交互。用户可以通过该界面查询停车费用,并进行付款。同时,选手还需要保证系统的稳定性和安全性,确保数据的准确性和保密性。 总而言之,蓝桥杯嵌入式STM32G431第十二第一场省赛停车计费系统真题工程要求选手使用硬件和软件开发能力,设计并实现一个完整的停车计费系统。这需要选手具备嵌入式系统开发、传感器技术、算法设计和界面设计等多方面的知识和技能。 ### 回答3: 蓝桥杯嵌入式stm32g431——第十二第一场省赛停车计费系统真题工程是一个基于STM32G431开发板的停车计费系统设计题目。该系统的主要功能是实现停车场的车辆进入、出场的计费管理。 首先,该系统需要实现一个车辆进入检测的功能。当车辆进入停车场时,系统会通过传感器检测到车辆的到达,并记录下进入的时间。 然后,系统需要实现一个车辆出场的功能。当车辆准备离开停车场时,系统会通过传感器检测到车辆的离开,并记录下离开的时间。 接下来,系统需要计算车辆停留的时间。通过进入时间和离开时间的差值计算得出车辆停留的时长。 最后,系统需要计算停车费用。根据停车场的计费规则,根据车辆停留的时长计算出停车费用,并将费用显示在屏幕上。 在实现上述功能的过程中,需要运用STM32G431开发板的各种功能和模块,包括GPIO口、定时器、中断、串口通信等。通过编写相应的代码,实现按钮的控制、传感器检测、时间的计算以及屏幕的显示等功能。 该项目的设计需要考虑多种情况,比如车辆重复进入出场、车辆进入出场顺序错乱等,要充分考虑这些异常情况并进行相应的处理。在代码编写过程中,还需注意代码的优化和资源的合理利用,以提高系统的性能和效率。 通过完成这个项目的设计与实现,可以加深对STM32G431嵌入式系统的了解和应用,并提升嵌入式系统开发的能力。同时,也能锻炼自己的逻辑思维、问题解决能力和团队合精神。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值