我写了个程序,用TIM3实现四路PWM输出,仿真结果发现第一个周期输出波形不对,其它的都好的,查了两天没找出毛病,特来向各位求教啊
波形图:
我的程序:
#include "stm32f10x.h"
void gpio_pwminit(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; //PA6-CH1 PA7-CH2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; //PB0-CH3 PB1-CH4
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void timer3_init(u16 DIV_value,u16 period)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
u16 CCR1VAL = 100;
u16 CCR2VAL = 400;
u16 CCR3VAL = 600;
u16 CCR4VAL = 800;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_ARRPreloadConfig(TIM3, ENABLE); // 使能TIM3预装载寄存器的buffer
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能CCR1预装载
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能CCR2预装载
TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能CCR3预装载
TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能CCR4预装载
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //配置为PWM模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //当定时器计数值小于CCR1_Val时为高电平
// TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //当定时器计数值小于CCR1_Val时为低电平
TIM_OCInitStructure.TIM_Pulse = CCR1VAL; //设置跳变值,当计数器计数到这个值时,电平发生跳变
TIM_OC1Init(TIM3, &TIM_OCInitStructure); //使能通道1
TIM_OCInitStructure.TIM_Pulse = CCR2VAL; //设置通道2的电平跳变值,输出另外一个占空比的PWM
TIM_OC2Init(TIM3, &TIM_OCInitStructure); //使能通道2
TIM_OCInitStructure.TIM_Pulse = CCR3VAL; //设置通道3的电平跳变值,输出另外一个占空比的PWM
TIM_OC3Init(TIM3, &TIM_OCInitStructure); //使能通道3
TIM_OCInitStructure.TIM_Pulse = CCR4VAL; //设置通道4的电平跳变值,输出另外一个占空比的PWM
TIM_OC4Init(TIM3, &TIM_OCInitStructure); //使能通道4
TIM_TimeBaseStructure.TIM_Period = period; //定时器计数周期
TIM_TimeBaseStructure.TIM_Prescaler = DIV_value; //定时器时钟分频
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //初始化时基单元
TIM_Cmd(TIM3, ENABLE); //使能定时器3
}
int main(void)
{
gpio_pwminit();
timer3_init(7199,999);
while(1)
{
}
}
|