关于加减速脉冲输出

2019-10-15 22:55发布

     看到很多工控的朋友都在用STM32做发加减速固定脉冲pwm,看了很大网上的资料大多数都是用一个固定时间的定时器发一个波进入一次中断,在中断中计脉冲数,总感觉这样繁忙进中断欠妥。其实用STM32其强大的外设应该可以做出微占用,或不占用CPU的程序。以下是本人的思路:使用两个定时器,一个定时器用于PWM输出,第二个定时器用于计数。先计算好加减速的数据共DMA用。第二个定时器计数完成触发DMA传送数据(同时送CR1启动两个定时器)我没有用DMA,以下是我的程序:
void PWM_Init(void)//这是TM3定时器PWM输出,TM4定时器用于计数的寄存器配置
{                                                          
       
        RCC->APB1ENR|=1<<1;        
        RCC->APB1ENR|=1<<2;                          
        GPIOB->CRL&=0XFFFFFFF0;
        GPIOB->CRL|=0X0000000B;           
        GPIOB->ODR|=1<<0;
        TIM3->PSC=71;
        TIM3->CR2|=1<<5;
    TIM4->SMCR|=1<<5;          //        &#196;ú2&#191;′¥·¢2(ITR2)£&#172;TIM3
        TIM4->SMCR|=7<<0;        // ía2&#191;ê±&#214;ó&#196;£ê&#189;1 ¨C &#209;&#161;&#214;Dμ&#196;′¥·¢ê&#228;è&#235;(TRGI)μ&#196;é&#207;éy&#209;&#216;&#199;y&#182;ˉ&#188;&#198;êy&#198;÷&#161;£                         
    TIM4->DIER|=1<<6;        //&#212;êDí&#214;D&#182;&#207;
        TIM4->DIER|=1<<0;         // ê1&#196;ü               
        TIM4->CR1|=1<<2;        //è&#231;1&#251;ê1&#196;üá&#203;&#184;üD&#194;&#214;D&#182;&#207;£&#172;&#212;ò&#214;&#187;óD&#188;&#198;êy&#198;÷ò&#231;3&#246;2&#197;2úéú&#184;üD&#194;&#214;D&#182;&#207;&#199;&#235;&#199;
        TIM3->CCMR2|=7<<4;  //CH2 PWM2&#196;£ê&#189;                 
        TIM3->CCMR2|=1<<3;  //CH2&#212;¤×°&#212;&#216;ê1&#196;ü          

        TIM3->CCER|=1<<8;   //OC2 ê&#228;3&#246;ê1&#196;ü          
        TIM3->CR1=0x8000;   //ARPEê1&#196;ü
        MY_NVIC_Init(1,3,TIM4_IRQn,2);                                                                                  
}           


void PWM_out(u16 arr,u16 psc)//发出固定脉冲arr输出频率psc输出个数
{
    TIM3->ARR=1000000/arr-1;//éè&#182;¨&#188;&#198;êy&#198;÷×&#212;&#182;ˉ&#214;&#216;×°&#214;μ
    TIM3->CCR3=(1000000/arr)/2;   //&#213;&#188;&#191;&#213;±è50%
           TIM4->ARR=psc-1;
    TIM3->CR1|=0x01;    //ê1&#196;ü&#182;¨ê±&#198;÷3
          TIM4->CR1|=0X1;                //ê1&#196;ü&#182;¨ê±&#198;÷
}
void jiajiansuPWM_out(u16 arr,u16 psc,u16 time)//c[]用于保存十段加速的频率d[]用于保存十段加减速的个数。arr输出频率,psc输出个数, time加减速时间ms
{   
        u8 i;
        u16 j,k=0;
        j=arr/10;//2&#189;&#189;&#248;&#194;&#246;3&#229;êy£&#172;&#198;μ&#194;ê
        for(i=1;i<10;i++)
   {
                 c=j*i;
                 d=c*time/(1000);
                 k=k+c*time/(1000);
         }
         c[10]=arr;
         d[10]=psc-2*k;
        for(i=1;i<10;i++)
   {
     c[20-i]=c;
                 d[20-i]=d;
   }
   b=19;       
         PWM_out(c,d);
}

void TIM4_IRQHandler(void)中断函数
{                                                                   
        if(TIM4->SR&0X0001)
        {
        TIM3->CR1&=0xfffe;                                                                                                                       
        }                                  
        TIM4->SR&=~(1<<0);
        b--;
  if(b!=0) {PWM_out(c,d);}
}

int main(void)
{               
        Stm32_Clock_Init(9); //&#207;μí3ê±&#214;óéè&#214;&#195;
        delay_init(72);             //&#209;óê±3&#245;ê&#188;&#187;ˉ
        uart_init(72,9600);  //′&#174;&#191;ú3&#245;ê&#188;&#187;ˉ
        LED_Init();                           //3&#245;ê&#188;&#187;ˉó&#235;LEDá&#172;&#189;óμ&#196;ó2&#188;t&#189;ó&#191;ú
        PWM_Init();         //2&#187;·&#214;&#198;μ&#161;£PWM&#198;μ&#194;ê=72000/900=8Khz
        while(1)
        {
                jiajiansuPWM_out(2000,500,10);
                while(1);
        }         
}
QQ浏览器截图_20160730180924_89A00C2ADA20494dA15ACB1681B84388.jpg

QQ浏览器截图_20160730181545_F75F3873F15C4d59AC776B625033F5CB.jpg

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。