|
小弟现在用推挽电路生成正弦波,需要两路PWM信号,如图所示。要求严格中心同步。
我现在用了两个定时器,一个用于生成两路PWM,只是给定的周期不同;另外一个用于定时更换两路PWM的周期。但是两个PWM不同步,很困惑。
核心代码如下:
vu16 Duty_Cycle_sinewavetable[25] = {36,42,49,54,58,61,62,62,60,56,51,46,39,33,26,21,16,12,10,10,11,14,18,23,30};
vu16 Duty_Cycle_sinewavetable2[25] = {30,36,43,48,52,55,56,56,54,50,45,40,33,27,20,15,10,6,4,4,5,8,12,17,24};
vu16 Counter_sine=0;
void GPIO_Configure()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void TIM_Configure()
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
TIM_TimeBaseStructure.TIM_Period = 71;
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned3; //计数方式
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
TIM_ARRPreloadConfig(TIM1, ENABLE);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_Pulse = 0;//DutyFactor * 7200 / 100;//设置占空比
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//这里的4行代码就是设置PWM的空闲电平、波形方式的!一开始自己一不小心搞成了都高的死区,这里是都低电平的死区~
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
// TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
TIM_OC1Init(TIM1, &TIM_OCInitStructure);
TIM_OC2Init(TIM1, &TIM_OCInitStructure); //初始化两组互补的PWM
TIM_CtrlPWMOutputs(TIM1, ENABLE); /* 主输出启用 */
}
void NVIC_Configure()
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel = SysTick_IRQn; //
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //副优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
int main(void)
{
SystemInit(); //系统时钟初始化至72M
GPIO_Configure();
TIM_Configure();
NVIC_Configure();
TIM_Cmd(TIM1, ENABLE);
SysTick_Init(); //定时中断,10ms一次
while(1);
}
void SysTick_Handler(void)
{
TIM_SetCompare1(TIM1, Duty_Cycle_sinewavetable2[Counter_sine]);
TIM_SetCompare2(TIM1, Duty_Cycle_sinewavetable[Counter_sine]);
Counter_sine++;
if(Counter_sine > 24) //?????100??
{
Counter_sine = 0;
}
} |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|