• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

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

liubo 2021-03-31 浏览量:901
用STM32的定时器TIM1产生四路两两互补的PWM波,用TIM2的中断来改变TIM1的输出波形的比较值,时序图如下,示波器的波形图为:用TIM1的CH1CH2CH1NCH2N来产生A、B、C、D代码为

void TIM1_PWM_Init(u16 arru16 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 arru16 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(20TIM2_IRQn2); //抢占优先级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); //清楚中断标志位

}

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

0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 没有按你的要求,你的要求是什么呢,说明白啊,这样才能根据程序看出问题的。或你自己测个波形说明


    • 发布于 2021-04-08
    • 举报
    • 评论 0
    • 0
    • 0

其他答案 数量:2
  • 都是用的寄存器操作,无法判断,需要对底层寄存器有一定的了解才可以的,为什么不用库呢?
    • 发布于2021-03-31
    • 举报
    • 评论 0
    • 0
    • 0

  • 你最好是发一下示波器的波形吧,这通过波形上就能看出是哪个中断的问题了
    • 发布于2021-04-02
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

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