利用野火指南者STM32F103VE单片机输出SPWM波
时间: 2025-05-25 22:03:28 浏览: 19
### STM32F103VE 野火指南者单片机 SPWM 波输出配置
SPWM(Sinusoidal Pulse Width Modulation)是一种用于逆变器和其他电力电子应用中的调制技术。通过生成正弦波形的脉宽调制信号,可以实现高效的功率转换。
以下是基于STM32F103VE单片机生成SPWM波的具体方法和代码示例:
#### 1. 定义硬件资源
在STM32F103VE中,可以通过定时器(如TIM1、TIM3等)配合PWM模式来生成SPWM波。假设我们使用TIM3作为主要定时器,并选择PB5引脚作为PWM输出通道[^2]。
#### 2. 初始化GPIO端口
为了使能PB5作为PWM输出,需要先初始化对应的GPIO端口并设置为复用功能模式。
```c
void GPIO_Init(void) {
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); // 启用GPIOB与时钟
GPIO_InitTypeDef GPIO_InitStruct;
// PB5 配置为复用推挽输出 (TIM3_CH2)
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; // 设置速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStruct);
}
```
#### 3. 配置定时器TIM3
接下来配置TIM3以支持PWM输出模式。这里我们将使用TIM3的一个通道(例如CH2),并通过软件计算得到所需的占空比变化规律。
```c
void TIM3_PWM_Init(uint16_t arr, uint16_t psc) {
TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;
TIM_OCInitTypeDef TIM_OCInitStruct;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // 开启TIM3时钟
// 配置基本参数
TIM_TimeBaseStruct.TIM_Period = arr; // 自动重装载值
TIM_TimeBaseStruct.TIM_Prescaler = psc; // 预分频系数
TIM_TimeBaseStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStruct);
// 配置OC模式为PWM Mode 1
TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStruct.TIM_Pulse = 0; // 初始占空比为0%
TIM_OC2Init(TIM3, &TIM_OCInitStruct);
TIM_Cmd(TIM3, ENABLE); // 启用TIM3
TIM_CtrlPWMPin(TIM3, TIM_Channel_2, ENABLE); // 控制PWM引脚启用
}
// 调整占空比函数
void Set_DutyCycle(uint16_t duty_cycle) {
TIM_SetCompare2(TIM3, duty_cycle); // 更新比较寄存器值
}
```
#### 4. 正弦表与SPWM逻辑
要生成SPWM波,需构建一个正弦波表格存储不同角度下的幅值数据。这些数值会被映射到定时器的自动重载寄存器ARR以及比较寄存器CCR上,从而动态调整PWM的占空比。
```c
#define SIN_TABLE_SIZE 100 // 正弦表大小
uint16_t sin_table[SIN_TABLE_SIZE];
void Generate_Sine_Table() {
float angle_step = (float)(2 * M_PI / SIN_TABLE_SIZE); // 计算每步的角度增量
for(int i=0;i<SIN_TABLE_SIZE;i++) {
sin_table[i] = (int)((sin(angle_step*i)+1)*2047); // 将[-1,+1]范围内的正弦值缩放到[0,4095]
}
}
void Start_SPWM_Generation() {
int index = 0;
while(1){
Set_DutyCycle(sin_table[index]); // 使用当前索引更新占空比
index++;
if(index >= SIN_TABLE_SIZE) {index = 0;} // 循环回滚至起点
Delay_ms(1); // 延迟时间取决于期望频率
}
}
```
以上代码片段展示了如何利用STM32F103VE上的定时器模块生成SPWM波的过程。需要注意的是实际项目可能还需要考虑更多细节比如死区时间插入等问题[^1]。
---
阅读全文
相关推荐

















