新手入门
- 积分
- 18
- 金钱
- 18
- 注册时间
- 2020-2-20
- 在线时间
- 7 小时
|
1金钱
最近调试STM32F407 多路PWM输出,现在遇到一个问题:
我的工程中要输出18路PWM,其中定时器1我用CH1,CH2,CH3,CH4,同样设置只有CH4输出,CH1,CH2,CH3都没有输出,其他定时器的输出也正常;
CH1,CH2,CH3,硬件电路没有问题,初始化程序如下:
void PwmAInit(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
uint16_t usPeriod;
uint16_t usPrescaler;
uint32_t uiTIMxCLK;
char i;
RCC_APB2PeriphClockCmd(bsp_GetRCCofTIM(TIM1), ENABLE);//打开定时器时钟
RCC_APB2PeriphClockCmd(bsp_GetRCCofTIM(TIM8), ENABLE);
RCC_APB2PeriphClockCmd(bsp_GetRCCofTIM(TIM9), ENABLE);
RCC_APB1PeriphClockCmd(bsp_GetRCCofTIM(TIM4), ENABLE);
RCC_APB1PeriphClockCmd(bsp_GetRCCofTIM(TIM5), ENABLE);
RCC_APB1PeriphClockCmd(bsp_GetRCCofTIM(TIM12), ENABLE);
uiTIMxCLK = SystemCoreClock;
if((PWMFREG_DEF/1000)>0)//1k---10k
{
usPrescaler= 8 ;
usPeriod =21000000/PWMFREG_DEF ;
}
else if((PWMFREG_DEF/100)>0)//100-1k
{
usPrescaler= 168;
usPeriod =1000000/PWMFREG_DEF ;
}
else if((PWMFREG_DEF/10)>0)//10--100
{
usPrescaler= 1680 ;
usPeriod =100000/PWMFREG_DEF ;
}
else //0-10
{
usPrescaler= 16800 ;
usPeriod =10000/PWMFREG_DEF ;
}
for(i=0;i< MAXCH ;i++)//设置 IO,周期,占空比
{
SetPwmGpio(i);
PWM_ARR= usPeriod ;
pud=0;
}
/* Time base configuration */
TIM_TimeBaseStructure.TIM_Period = usPeriod-1; //设置定时器
TIM_TimeBaseStructure.TIM_Prescaler = usPrescaler-1;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);
TIM_TimeBaseInit(TIM9, &TIM_TimeBaseStructure);
TIM_TimeBaseStructure.TIM_Period = usPeriod-1;
TIM_TimeBaseStructure.TIM_Prescaler = usPrescaler/2-1;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);
TIM_TimeBaseInit(TIM12, &TIM_TimeBaseStructure);
/* PWM1 Mode configuration: Channel1 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //设置PWM
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = pud[0] ; //(usPeriod +1)/ 2;// 占空比
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM9, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM9, TIM_OCPreload_Enable);
TIM_OC2Init(TIM9, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM9, TIM_OCPreload_Enable);
TIM_OC1Init(TIM1, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
TIM_OC2Init(TIM1, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);
TIM_OC3Init(TIM1, &TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);
TIM_OC4Init(TIM1, &TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable);
TIM_OC1Init(TIM12, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM12, TIM_OCPreload_Enable);
TIM_OC2Init(TIM12, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM12, TIM_OCPreload_Enable);
TIM_OC1Init(TIM5, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM5, TIM_OCPreload_Enable);
TIM_OC2Init(TIM5, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM5, TIM_OCPreload_Enable);
TIM_OC3Init(TIM5, &TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM5, TIM_OCPreload_Enable);
TIM_OC1Init(TIM4, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);
TIM_OC2Init(TIM4, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);
TIM_OC3Init(TIM4, &TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);
TIM_OC4Init(TIM4, &TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);
TIM_OC1Init(TIM8, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM8, TIM_OCPreload_Enable);
TIM_OC2Init(TIM8, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM8, TIM_OCPreload_Enable);
TIM_OC3Init(TIM8, &TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM8, TIM_OCPreload_Enable);
TIM_OC4Init(TIM8, &TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM8, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM9, ENABLE);
TIM_Cmd(TIM9, ENABLE);
TIM_ARRPreloadConfig(TIM1, ENABLE);
TIM_Cmd(TIM1, ENABLE);
TIM_ARRPreloadConfig(TIM12, ENABLE);
TIM_Cmd(TIM12, ENABLE);
TIM_ARRPreloadConfig(TIM5, ENABLE);
TIM_Cmd(TIM5, ENABLE);
TIM_ARRPreloadConfig(TIM4, ENABLE);
TIM_Cmd(TIM4, ENABLE);
TIM_ARRPreloadConfig(TIM8, ENABLE);
TIM_Cmd(TIM8, ENABLE);
TIM_CtrlPWMOutputs(TIM1, ENABLE);
TIM_CtrlPWMOutputs(TIM8, ENABLE);
}
求各位大侠帮忙指点,谢谢!
|
最佳答案
查看完整内容[请看2#楼]
参考这个http://www.openedv.com/forum.php?mod=viewthread&tid=285304
|