stm32f103c8t6 pwm 脉宽调制
时间: 2025-01-06 20:35:54 浏览: 52
STM32F103C8T6 PWM 脉宽调制实现方法
初始化定时器
为了在STM32F103C8T6上实现PWM功能,首先需要初始化一个定时器。通常使用的定时器有TIM1, TIM2, TIM3等。这里以TIM2为例说明如何设置。
void TIM2_PWM_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能定时器2时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIOA端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //PA1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Period = 999; //自动重装载值
TIM_TimeBaseStructure.TIM_Prescaler = 7199; //预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 499; //占空比初始值
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
}
上述代码完成了对定时器TIM2以及相应IO口的初始化工作[^1]。
启动PWM信号输出
完成定时器配置之后,还需要启动通道并开启中断来触发PWM波形生成:
int main(void)
{
NVIC_Configuration();
TIM2_PWM_Init();
TIM_Cmd(TIM2, ENABLE); //使能定时器2
TIM_CtrlPWMOutputs(TIM2,ENABLE); //使能PWM输出
while (1){
// 主循环体可以放置其他程序逻辑
}
}
这段代码展示了如何通过main()
函数中的调用来激活之前定义好的PWM参数,并保持MCU处于运行状态等待事件发生。
动态调整PWM占空比
如果想要动态改变PWM输出频率或占空比,则可以通过修改定时器的相关寄存器来进行操作。比如下面的例子就是每秒钟切换一次高电平持续时间(即改变占空比):
uint16_t duty_cycle = 250; // 初始占空比为25%
while(1) {
if(duty_cycle >= 1000) {duty_cycle=250;}else{duty_cycle+=2;}
TIM_SetCompare1(TIM2,duty_cycle); // 设置比较值从而更改占空比
Delay_ms(1000); // 延迟一秒再更新下一轮数值
}
// 定义延时函数用于精确控制间隔时间
void Delay_ms(u16 nms)
{
u32 temp,ticks;
SysTick->LOAD=nms*SystemCoreClock/10000-1;//加载计数初值
SysTick->VAL=0x00; //清空当前计数值
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //使能systick
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16))); //判断是否溢出标志位被置位
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;//失能systick
SysTick->VAL =0X00; //清除当前计数值
}
此部分实现了周期性的增减PWM输出的占空比例,以此达到LED亮度渐变的效果或其他类似需求下的应用实例。
相关推荐


















