【蓝桥杯嵌入式】定时器的PWM输出与输入捕获(测量频率与占空比)

【蓝桥杯嵌入式】定时器的PWM输出与脉冲输 入捕获(测量频率与占空比)

PWM输出

cubemx配置

  PWM输出引脚配置,这里使用PA6和PA7引脚输出两路PWM信号,分别对应的是由TIM16和TIM17的通道1产生的PWM信号,同时配置定时器的预分频系数PSC和自动重装载值CCR,PWM信号频率即为:
frq = 80000000 / (PSC+1)/ (ARR+1)
这里预分频系数为800-1,自动重装载值为100,则频率 frq = 80000000 / 800 / 100 = 1K Hz,占空比预设置为20%

同理 对TIM17通道1进行相关配置,使得输出频率为2KHz,占空比初始化为20%的PWM信号

程序设计

通过cubemx配置后,初始化信号的参数如下所示

//PA6 1KHz 20%
TIM16->PSC = 800-1;
TIM16->ARR = 100-1;
TIM16->CCR1 = 20;

//PA7 2KHz 20%
TIM17->PSC = 400-1;
TIM17->ARR = 100-1;
TIM17->CCR1 = 20;

启动PWM输出: 启动TIM16与TIM17的通道1输出PWM信号

HAL_TIM_PWM_Start(&htim16,TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim17,TIM_CHANNEL_1);

修改PWM信号占空比: 通过改变TIM16与TIM17通道1的自动重装载值来改变PWM信号的占空比

TIM16->CCR1 = 50;
TIM17->CCR1 = 25;

修改PWM信号的频率:,可以通过改变预分频系数PSC,或者改变自动重装值,但通过修改自动重装载值修改频率的同时会修改占空比。

TIM16->PSC = 400-1;	//将PA6引脚的频率改为2000 Hz 占空比保持不变
TIM17->ARR = 50-1;	//将PA7的频率改为4000 Hz 但占空比变为原来的2倍

输入捕获

  • 输入捕获可以用来测量PWM波的频率与占空比
  • 输入捕获模式下,当通道输入引脚出现指定高电平跳变时,当前CNT的值将被锁存到CCR中

cubemx配置

  通过查看原理图发现,开发板自带2路555信号发生器,分别通过接口J9和J10接到开发板的PB4和PA15端口,这里取下跳线帽,通过杜邦线将PA6、PA7的PWM信号接入到PA15、PB4引脚,用于检测PWM信号的频率与占空比。

  通过配置PB4引脚为TIM3_CH1,开启定时器3,设置预分频系数,配置从模式、触发源及其时钟源,分别设置通道1和通道2为直接模式与间接模式,同时设置为上升沿触发和下降沿触发。

同理对TIM2进行同样的配置

程序设计

初始化开启定时器的通道捕获

HAL_TIM_IC_Start(&htim2,TIM_CHANNEL_1);
HAL_TIM_IC_Start(&htim3,TIM_CHANNEL_1);
HAL_TIM_IC_Start(&htim2,TIM_CHANNEL_2);
HAL_TIM_IC_Start(&htim3,TIM_CHANNEL_2);

频率和占空比的测量

void pwm_process(void)
{
	//测量频率
	frq1 = 1000000.0f / (HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_1)+1);
	frq2 = 1000000.0f / (HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_1)+1);
	
	//测量占空比
	duty1 = (HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_2)+1) * 100.0f / (HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_1)+1);
	duty2 = (HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_2)+1) * 100.0f / (HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_1)+1);
}

真题典例分析

  • PA6输出信号占空比通过电位器R37进行调节如图调节
  • 通过B2按键切换高低频模式,并通过LCD进行实时显示

adc数据采集功能函数:

double getAdcVal(ADC_HandleTypeDef *pin)
{
	double dat;
	HAL_ADC_Start(pin);
	dat = HAL_ADC_GetValue(pin);
	return dat * 3.3 / 4096;	
}

adc业务逻辑程序进程函数: 首先确定adc数据采集周期为200ms采集一次,并进行数字滤波,最后通过电压与占空比的关系,来确定PA6引脚的占空比。

u32 adc_tick = 0;
double adc_sum = 0;
void adc_process(void)
{
	//adc采集周期 200ms
	if(uwTick - adc_tick < 200)
		return;
	adc_tick = uwTick;
	
	//adc数字滤波
	for(uchar i = 0; i < 10; i++)
		adc_sum += getAdcVal(&hadc2);
	vr37 = adc_sum / 10.0f;
	adc_sum = 0;
	
	//通过电压改变PWM占空比
	if(vr37 <= 1.0f)
		TIM16->CCR1 = 10;
	else if(vr37 >= 3.0f)
		TIM16->CCR1 = 85;
	else
		TIM16->CCR1 = (uchar)(37.5 * (vr37 - 1.0f) + 10);
}

按键二: 启动5秒定时,并确定是从高频到低频,还是从低频到高频

if(key[1].single_flag == 1)
{
	//按键2短按业务逻辑程序
	//shake_flag = !shake_flag;
	up_flag = !up_flag;					//从低频到高频标志
	sec5_flag = !sec5_flag;			//5秒定时标志
	HAL_TIM_Base_Start_IT(&htim7);	//启动定时器 改变分频系数
	key[1].single_flag = 0;
}

定时器中断服务函数

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{	
	if(htim->Instance == TIM7)		//50ms
	{
		if(up_flag)
			psc--;
		else
			psc++;
	}
}

PWM进程函数: 频率、占空比的修改与测量

void pwm_process(void)
{
	//通过修改预分频系数修改频率
	TIM16->PSC = psc;
	
	//检测PWM信号频率
	frq1 = 1000000.0f / (HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_1)+1);
	frq2 = 1000000.0f / (HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_1)+1);
	
	//检测PWM信号占空比
	duty1 = (HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_2)+1) * 100.0f / (HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_1)+1);
	duty2 = (HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_2)+1) * 100.0f / (HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_1)+1);
}

最后将实时的频率与占空比显示在LCD屏幕

void lcd_process(void)
{
	if(ui == 0)					//第一个界面显示的内容
	{
		sprintf(text,"     Title1 ");
		LCD_DisplayStringLine(Line1, (unsigned char *)text);	//LCD显示函数
		
		sprintf(text,"    frq1:%dHz  ",frq1);
		LCD_DisplayStringLine(Line3, (unsigned char *)text);	//LCD显示函数
		sprintf(text,"    duty1:%d%% ",duty1);
		LCD_DisplayStringLine(Line4, (unsigned char *)text);	//LCD显示函数
		sprintf(text,"    frq2:%dHz  ",frq2);
		LCD_DisplayStringLine(Line5, (unsigned char *)text);	//LCD显示函数
		sprintf(text,"    duty2:%d%% ",duty2);
		LCD_DisplayStringLine(Line6, (unsigned char *)text);	//LCD显示函数
	}
}
  • 14
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Hal库是一个用于嵌入式系统的硬件访问层库。该库提供了一些函数和接口,用于与硬件设备进行交互。在使用Hal库进行输入捕获测量占空比时,可以按照以下步骤进行操作。 首先,需要选择一个支持输入捕获功能的硬件定时器。然后,需要使用Hal库的相关函数来配置定时器的工作模式和输入捕获功能。 接下来,设置输入捕获的触发源。可以选择外部输入引脚或其他事件作为触发源,当触发事件发生时,定时器会记录下当前的计数值。 然后,启动定时器,开始计数。当触发事件发生时,Hal库会自动记录下当前的计数值,并触发一个输入捕获事件。 在输入捕获事件中,可以通过Hal库提供的接口,获取到输入捕获值。输入捕获值表示两个连续触发事件之间的定时器计数差值。 通过计算输入捕获值与定时器周期的比值,可以得到占空比占空比表示高电平信号在一个周期内的持续时间占整个周期的比例。 最后,可以根据需求进行进一步的处理,比如计算平均占空比或根据占空比值做一些控制操作。 总之,使用Hal库进行输入捕获测量占空比的步骤包括选择定时器、配置工作模式和输入捕获功能、设置触发源、启动定时器、获取输入捕获值并计算占空比。这样就可以实现对占空比测量和处理。 ### 回答2: Hal库是一个用于嵌入式系统的硬件抽象层。它提供了一组API,用于管理和访问硬件资源。在使用Hal库时,我们可以使用输入捕获功能来测量信号的占空比输入捕获是一种用于测量和记录信号占空比的技术。在嵌入式系统中,我们通常会遇到需要测量某个信号的占空比的情况,例如PWM信号或时钟信号等。通过使用Hal库提供的输入捕获功能,我们可以方便地进行这些测量。 使用Hal库进行输入捕获测量占空比的步骤如下: 1. 初始化输入捕获功能:首先,我们需要初始化Hal库的输入捕获功能,以准备开始测量。通常,我们需要设置输入捕获的参数,如计数模式、采样频率等。 2. 开始捕获信号:一旦输入捕获功能初始化完成,我们就可以开始捕获需要测量的信号了。通过调用Hal库提供的相应API函数,我们可以开始记录信号的时间信息。 3. 停止捕获信号:在信号捕获到一定的时间间隔后,我们可以停止捕获。通过调用Hal库提供的停止捕获的函数,我们在此时停止记录时间信息。 4. 计算占空比:一旦停止捕获信号,我们可以使用记录的时间信息计算信号的占空比。通常,我们可以通过测量信号高电平和低电平的持续时间来计算占空比。 总的来说,Hal库的输入捕获功能提供了一种方便的方式来测量信号的占空比。通过使用Hal库,我们可以轻松地进行这些测量,并且可以根据需要调整捕获的参数。这使得我们能够更好地理解和控制我们的嵌入式系统中的信号。 ### 回答3: HAL库是一种有助于开发嵌入式系统的开源库。它提供了丰富的功能和API,能够简化硬件驱动和应用程序开发的过程。 在HAL库中,输入捕获是一种测量占空比的功能。占空比是指周期性信号中高电平所占的比例。输入捕获能够准确地测量信号的上升沿和下降沿的时间间隔,并计算出占空比。 在使用HAL库进行输入捕获测量时,首先需要通过初始化GPIO引脚和定时器等外设来配置输入捕获功能。然后,可以使用HAL库提供的API函数来启动输入捕获测量并获取测量结果。 例如,可以使用hal_input_capture_start()函数来启动输入捕获测量,并通过hal_input_capture_get_duty_cycle()函数获取测量结果。这个函数返回一个浮点数,表示输入信号的占空比。 使用HAL库进行输入捕获测量还可以通过设置回调函数来实时获取测量结果。可以使用hal_input_capture_register_callback()函数注册回调函数,在每次捕获到输入信号边沿时,HAL库会调用这个回调函数,并把测量结果作为参数传递给回调函数。 总之,HAL库提供了输入捕获功能,能够帮助开发人员方便地测量信号的占空比。通过合理配置和调用HAL库的API函数,可以实现准确的输入捕获测量,并获取测量结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会编程的小江江

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值