请教一个如何准确输出PWM脉冲个数的方法

2019-08-14 05:29发布

我现在想要控制步进电机,那么就需要准确的控制PWM的脉冲个数,,请问如何能准确控制PWM脉冲个数呢?
我现在的想法是,使用STM32的捕获比较,输出PWM波,每次定时器溢出时,计数+1,然后达到目标个数时候,关闭定时器;请问还有什么更好的方法吗?
#include "pwm.h"
#include "stm32f10x.h"

#define LED0 PBout(5)// PB5
#define LED1 PEout(5)// PE5       

int i=0,j=60000;

void pwm_init(u16 arr,u16 pre)
{
        GPIO_InitTypeDef GPIO_Initstrue;
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitstrue;
        TIM_OCInitTypeDef TIM_OCInitstrue;
        NVIC_InitTypeDef NVIC_InitTypestrue;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE|RCC_APB2Periph_AFIO,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);  
                       
        GPIO_Initstrue.GPIO_Pin = GPIO_Pin_5;                                 //LED0-->PB.5 端口配置
        GPIO_Initstrue.GPIO_Mode = GPIO_Mode_AF_PP;                  //推挽输出
        GPIO_Initstrue.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度为50MHz
        GPIO_Init(GPIOB, & GPIO_Initstrue);                                        //根据设定参数初始化GPIOB.5

        GPIO_Initstrue.GPIO_Pin = GPIO_Pin_5;                                 //LED0-->PB.5 端口配置
        GPIO_Initstrue.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
        GPIO_Initstrue.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度为50MHz
        GPIO_Init(GPIOE, & GPIO_Initstrue);                                        //根据设定参数初始化GPIOE.5
       
       
        GPIO_SetBits(GPIOB,GPIO_Pin_5);                                                 //PB.5 输出高

        GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);
       
        TIM_TimeBaseInitstrue.TIM_CounterMode=TIM_CounterMode_Up;
        TIM_TimeBaseInitstrue.TIM_Period=arr;
        TIM_TimeBaseInitstrue.TIM_Prescaler=pre;
        TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitstrue);
       
        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
       
        GPIO_ResetBits(GPIOE ,GPIO_Pin_5);
       
        NVIC_InitTypestrue.NVIC_IRQChannel=TIM3_IRQn;
        NVIC_InitTypestrue.NVIC_IRQChannelCmd=ENABLE;
        NVIC_InitTypestrue.NVIC_IRQChannelPreemptionPriority=0;
        NVIC_InitTypestrue.NVIC_IRQChannelSubPriority=3;
        NVIC_Init(&NVIC_InitTypestrue);
       
        TIM_OCInitstrue.TIM_OCMode = TIM_OCMode_PWM2;                           //选择 PWM 模式 2
        TIM_OCInitstrue.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
        TIM_OCInitstrue.TIM_OCPolarity = TIM_OCPolarity_High;           //输出极性高
        TIM_OC2Init(TIM3,&TIM_OCInitstrue);
       
        TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);
        TIM_Cmd(TIM3,ENABLE);       
       
}


void TIM3_IRQHandler(void)
{
        if(TIM_GetFlagStatus(TIM3,TIM_IT_Update)==SET)
        {
                i++;
                if(i==j)
                {
                        //GPIO_ResetBits(GPIOE ,GPIO_Pin_5);
                        LED1=!LED1;
                        i=0;
                        //TIM_Cmd(TIM3,DISABLE);               
                }
                TIM_ClearITPendingBit(TIM3, TIM_IT_Update);  //清除TIMx更新中断标志               
        }
}

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