stm32同一定时器使用两个通道输出不同频率的pwm,想用中断方式对两路pwm的脉冲个数进行计数,但同一定时器只有一个中断函数怎么办?
一个定时器只能设置一个通道的PWM,可以不用中断的方式,使用模拟的方式输出可以设置频率的占空比波形。
#define PWM1 PEout(0)// PE2
#define PWM2 PEout(1)// PE3
#define PWM3 PEout(2)// PE4
#define PWM4 PEout(3)// PE3
#define PWM5 PEout(4)// PE5
#define PWM6 PEout(5)// PE2
#define PWM7 PEout(6)// PE3
#define PWM8 PEout(7)// PE4
//定时器2的向上计数设置
void TIM2_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能
//定时器TIM3初始化
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
//中断优先级NVIC设置
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //TIM3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //从优先级2级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
TIM_Cmd(TIM2, ENABLE); //使能TIMx
}
//
TIM2_Int_Init(20,8);//8M的计数频率,
void PWM_GOIO_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE); //使能PB,PE端口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; //PWM输出端
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOE, &GPIO_InitStructure);
}
//
void PWN_deal(void)
{
if(PWM_CON>150)PWM_CON=0;
if(PWM_CON<=state_pwm[0]){PWM1=1;}else{PWM1=0;}
if(PWM_CON<=state_pwm[1]){PWM2=1;}else{PWM2=0;}
if(PWM_CON<=state_pwm[2]){PWM3=1;}else{PWM3=0;}
if(PWM_CON<=state_pwm[3]){PWM4=1;}else{PWM4=0;}
if(PWM_CON<=state_pwm[4]){PWM5=1;}else{PWM5=0;}
if(PWM_CON<=state_pwm[5]){PWM6=1;}else{PWM6=0;}
if(PWM_CON<=state_pwm[6]){PWM7=1;}else{PWM7=0;}
if(PWM_CON<=state_pwm[7]){PWM8=1;}else{PWM8=0;}
}
//
void TIM2_IRQHandler(void) //TIM2中断,主要功能一秒钟读一次时间
{
static u32 m=0;
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否
{
PWM_CON++;if(PWM_CON>150)PWM_CON=0;
PWN_deal();
m++;
if(m>=65530)
{
m=0;
LED2 = ~LED2;
}
TIM_ClearITPendingBit(TIM2, TIM_IT_Update ); //清除TIMx更新中断标志
}
}
//
state_pwm[0]=25;
这样就可以输出8路pwm波形了。//state_pwm[x]取值范围在0~150就行了。
希望对你有用,哈哈。
stm32一个定时器只能配置一个频率的pwm波哦
http://www.enmaking.com/article/ar_hDXRpS16