stm32f103用PB端口输出两路pwm波,并且可调节频率和占空比的一个整体代码
时间: 2024-06-12 20:08:06 浏览: 128
以下是一个示例代码,实现在PB端口输出两路PWM波,可调节频率和占空比:
```
#include "stm32f10x.h"
#define PWM_FREQ 1000 // PWM频率
#define PWM_PERIOD (SystemCoreClock / PWM_FREQ) // PWM周期
#define PWM1_PIN GPIO_Pin_0
#define PWM2_PIN GPIO_Pin_1
#define PWM_PORT GPIOB
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
void TIM3_Init(void);
void PWM_Init(void);
void PWM_SetDuty(TIM_TypeDef* TIMx, uint16_t duty);
int main(void)
{
SystemInit(); // 系统时钟初始化
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // 使能TIM3时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 使能GPIOB时钟
GPIO_InitStructure.GPIO_Pin = PWM1_PIN | PWM2_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(PWM_PORT, &GPIO_InitStructure);
TIM3_Init(); // 初始化TIM3
PWM_Init(); // 初始化PWM
while (1)
{
// 可以在此处添加代码,调节PWM频率和占空比
}
}
// 初始化TIM3
void TIM3_Init(void)
{
TIM_TimeBaseInitStructure.TIM_Period = PWM_PERIOD - 1;
TIM_TimeBaseInitStructure.TIM_Prescaler = 0;
TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);
}
// 初始化PWM
void PWM_Init(void)
{
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM3, &TIM_OCInitStructure);
TIM_OC2Init(TIM3, &TIM_OCInitStructure);
TIM_Cmd(TIM3, ENABLE);
}
// 设置PWM占空比
void PWM_SetDuty(TIM_TypeDef* TIMx, uint16_t duty)
{
uint16_t pulse = (duty * (PWM_PERIOD - 1)) / 100;
TIMx->CCR1 = pulse;
TIMx->CCR2 = pulse;
}
```
在主函数中,先调用`SystemInit()`初始化系统时钟,然后使能TIM3和GPIOB的时钟。接着配置GPIOB的PB0和PB1为复用推挽输出模式,并初始化TIM3和PWM。
在`PWM_Init()`函数中,先使用`TIM_OC1Init()`和`TIM_OC2Init()`初始化TIM3的通道1和通道2,然后使能TIM3。
最后,在`PWM_SetDuty()`函数中,根据占空比计算出PWM脉冲宽度,再更新TIM3的CCR1和CCR2寄存器即可。
你可以在主函数中添加代码,调节PWM频率和占空比。例如,要将PWM1的频率改为500Hz,占空比改为50%,可以添加以下代码:
```
PWM_FREQ = 500;
PWM_PERIOD = (SystemCoreClock / PWM_FREQ);
TIM3->ARR = PWM_PERIOD - 1;
PWM_SetDuty(TIM3, 50);
```
阅读全文