蓝桥杯嵌入式-PWM(脉冲输出)
·
本篇文章是在蓝桥杯嵌入式-LCD完整的项目下补充完成的。如果需要代码,直接看第四部分的下载链接。
注:PWM输出引脚的配置得为:TIMx_CHx
例如:这款开发板的PA6引脚可以选择TIM16_CH1或TIM3_CH1
一、STM32CubMX配置
定时器配置说明:配置引脚为


二、代码方面
外置占空比方法(PA1修改方法),用于十四届真题保持占空比不变。其他时候直接用PA6修改方法即可
2.1 main.c
2.1.1 修改位置

2.1.2 对应代码
HAL_TIM_PWM_Start(&htim16,TIM_CHANNEL_1);//定时器和通道根据自己配置的引脚调整
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);
set_duty_PA6(50); //设置PA6输出占空比
set_freq_PA6(2000); //设置PA6输出频率
set_freq_PA1(2000); //外设占空比只需要上电设置频率即可,占空比改变只需改变变量duty_PA7的值,应用于占空比变化频繁的场景
2.2 task.c
2.2.1 修改位置


2.2.2 对应代码
float Duty_PA6; // PA6的占空比(显示设置变量值,与实际输出值情况无关)
void set_duty_PA6(float Duty)
{
Duty_PA6 = Duty;
TIM16->CCR1 = (TIM16->ARR + 1) * (Duty / 100.0f);
}
uint16_t Freq_PA6; // PA6的频率(Hz)(显示设置变量值,与实际输出值情况无关)
void set_freq_PA6(uint16_t Freq)
{
Freq_PA6 = Freq;
uint32_t arr_old = TIM16->ARR;
TIM16->ARR = (1000000 / Freq) - 1; // 计算ARR值(定时器时钟为1MHz)80,000,000/(79+1) = 1,000,000
// 根据新的ARR值调整CCR1,以保持占空比不变
TIM16->CCR1 = (TIM16->ARR + 1) * (TIM16->CCR1 / (float)(arr_old + 1));
TIM16->EGR = TIM_EGR_UG; // 产生更新事件,使新配置生效
}
float Duty_PA1 = 20;//PA1占空比调整修改此处
void set_duty_PA1(float Duty)
{
TIM2->CCR2 = (TIM2->ARR + 1) * (Duty / 100.0f);
}
uint16_t Freq_PA1;
void set_freq_PA1(uint16_t Freq)
{
Freq_PA1 = Freq;
TIM2->ARR = (1000000 / Freq) - 1; // 计算ARR值(定时器时钟为1MHz)
TIM2->CCR2 = (TIM2->ARR + 1) * (Duty_PA1 / 100.0f); // 设置占空比
TIM2->EGR = TIM_EGR_UG; // 产生更新事件,使新配置生效
}
void lcd_proc()
{
lcddisplay(Line2, " PA1 F:%d D:%.f",Freq_PA1,Duty_PA1);//不显示的位置用空格
lcddisplay(Line3, " PA6 F:%d D:%.f",Freq_PA6,Duty_PA6);//不显示的位置用空格
}
2.3 task.h
2.3.1 修改位置

2.3.2 对应代码
void set_duty_PA6(float Duty);
void set_freq_PA6(uint16_t Freq);
void set_duty_PA1(float Duty);
void set_freq_PA1(uint16_t Freq);
三、其他
3.1 测量PA1
注:测量PA6把PA1引脚换到PA6即可,GND引脚不用改动



3.2 完整代码下载
资料下载:https://pan.quark.cn/s/08f8e6116512
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐


所有评论(0)