OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4422|回复: 5

用STM32的定时器TIM1产生四路两两互补的PWM波,用TIM2的中断来改变TIM1的输出波形的比较值

[复制链接]

1

主题

3

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2019-6-5
在线时间
2 小时
发表于 2021-3-30 12:45:52 | 显示全部楼层 |阅读模式
用STM32的定时器TIM1产生四路两两互补的PWM波,用TIM2的中断来改变TIM1的输出波形的比较值,时序图如下,示波器的波形图为:用TIM1的CH1,CH2,CH1N,CH2N来产生A、B、C、D,,代码为

void TIM1_PWM_Init(u16 arr,u16 psc)
{
        RCC->APB2ENR|=1<<11;       //使能TIM1的时钟
//        RCC->APB2ENR|=0<<1;        //使能复用时钟
        RCC->APB2ENR|=1<<2;        //使能GPIOA的时钟CH1-PA9 CH2-PA10 CH1N-PB13 CH2N-PB14
        RCC->APB2ENR|=1<<3;        //使能GPIOB的时钟
       
        GPIOA->CRH&=0XFFFFFF00;     //PA9为复用推挽输出,最大速度50MHZ ,必须为复用推挽输出!!!
        GPIOA->CRH|=0X000000BB;
       
        GPIOB->CRH&=0XF00FFFFF;     //PA9为复用推挽输出,最大速度50MHZ ,必须为复用推挽输出!!!
        GPIOB->CRH|=0X0BB00000;
       
        TIM1->CCR1=6199;
        TIM1->CCR2=7199;

        TIM1->ARR=arr;                        //设定计数器自动重装值
        TIM1->PSC=psc;                        //预分频器不分频
       
//        TIM1->BDTR|=0xCD;     // 死区时间设定
       
        TIM1->CCER|=1<<0;//TIM1CH1通道开关使能
        TIM1->CCER|=1<<2;//TIM1CH1N 通道开关
       
        TIM1->CCER|=1<<4;
        TIM1->CCER|=1<<6;
       
        TIM1->CCMR1|=7<<4;          //CH1 PWM2模式
        TIM1->CCMR1|=1<<3;          //CH1预装载使能
       
        TIM1->CCMR1|=7<<12;          //CH2 PWM2模式                 
        TIM1->CCMR1|=1<<11;         //CH1预装载使能

       
        TIM1->CR1|=0X80;// CR1 ARPE自动重装载预装载允许位使能
       
       
//        TIM1->BDTR=0;
        TIM1->BDTR=0x80;
        TIM1->BDTR|=1<<15;  //刹车使能位置1,开启所有输出通道
//        TIM1->CR1|=0X01;   //使能定时计数器1
       
       
}


void  TIM2_Init(u16 arr,u16 psc )
{
        RCC->APB1ENR|=1<<0;           //使能TIM2的时钟
       
        TIM2->CR1&=0XFFEE;           //计数器向上计数
        TIM2->CR1|=0X0001;
       
        TIM2->ARR=arr;
        TIM2->PSC=psc;
        TIM2->DIER|=1<<0;           //允许更新中断

        MY_NVIC_Init(2,0,TIM2_IRQn,2); //抢占优先级2,子优先级2,组2
       

}

void TIM2_IRQHandler(void)
{
        static u8 cnt=0;
       
        if(TIM2->SR&0X0001)        //产生溢出中断
        {
                if (cnt==0)
                {
                        TIM2->ARR=7200;    //定时器中断时间设置为100us
                TIM2->PSC=0;
                       
                        TIM1->CCR1|=1<<0;
                        TIM1->CCR1=6199;   //6199
                        TIM1->CCR2=7199;
                       
                    cnt=1;
                }
                if(cnt==1)
                {
                        TIM2->ARR=7200;    //定时器中断时间设置为800us
                TIM2->PSC=7;
                       
                        TIM1->ARR=7200;    //定时器中断时间设置为800us
                TIM1->PSC=7;
                       
                        TIM1->CR1&=~(1<<0);
                        TIM1->CCR1=7199;
                        TIM1->CCR2=7199;
                        cnt=2;
               
                        LED1=!LED1;
                }
                if (cnt==2)
                {
                        TIM2->ARR=7200;    //定时器中断时间设置为100us
                TIM2->PSC=0;
                  
                        TIM1->ARR=7200;    //定时器中断时间设置为100us
                TIM1->PSC=0;
               
                        TIM1->CR1|=1<<0;
                        TIM1->CCR1=7199;
                        TIM1->CCR2=4500;
                       
                        cnt=0;
               
               
                }
       
        }

        TIM2->SR&=~(1<<0); //清楚中断标志位

}

感觉没有按照我的中断来输出波形,这是为什么呀,要实现我时序那样的波形应该写代码呀

示波器波形图.jpg
波形时序图.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

15

主题

1061

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
3627
金钱
3627
注册时间
2019-8-14
在线时间
1054 小时
发表于 2021-3-30 19:04:05 | 显示全部楼层
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2019-6-5
在线时间
2 小时
 楼主| 发表于 2021-4-6 09:28:02 | 显示全部楼层
别沉呀,顶顶
回复 支持 反对

使用道具 举报

16

主题

77

帖子

0

精华

高级会员

Rank: 4

积分
509
金钱
509
注册时间
2020-6-6
在线时间
230 小时
发表于 2021-4-6 09:38:42 | 显示全部楼层
帮顶,顶顶顶
上达日月,下至山川;泱泱吾土,与你何干?
回复 支持 反对

使用道具 举报

17

主题

587

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4467
金钱
4467
注册时间
2013-6-27
在线时间
565 小时
发表于 2021-4-6 10:27:07 | 显示全部楼层
if(cnt == 0){
:
cnt =1;
}
if(cnt == 1){
:
cnt = 2;
}
if(cnt == 2){
:
cnt = 0;
}
这三句每次中断都会执行
我觉得是不是得改成下面的
if(cnt == 0){
:
cnt =1;
}
else  if(cnt == 1){
:
cnt = 2;
}
else if(cnt == 2){
:
cnt = 0;
}

保证每次中断只执行一个if内容
让我们的思维驾驭在电的速度之上!
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2019-6-5
在线时间
2 小时
 楼主| 发表于 2021-4-19 14:45:46 | 显示全部楼层
DongInker 发表于 2021-4-6 10:27
if(cnt == 0){
:
cnt =1;

谢谢回复,我改下试试
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-28 02:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表