stm32同一定时器使用两个通道输出不同频率的pwm,想用中断方式对两路pwm的脉冲个数进行计数,但同一定时器只有一个中断函数怎么办?
3条回答
- qq_35510211 2019-01-22 19:13关注
一个定时器只能设置一个通道的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就行了。
希望对你有用,哈哈。本回答被题主选为最佳回答 , 对您是否有帮助呢?解决评论 打赏 举报无用 1
悬赏问题
- ¥15 eclipse运行项目时遇到的问题
- ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
- ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
- ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
- ¥50 成都蓉城足球俱乐部小程序抢票
- ¥15 yolov7训练自己的数据集
- ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
- ¥15 电力市场出清matlab yalmip kkt 双层优化问题
- ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)
- ¥20 matlab yalmip kkt 双层优化问题