请教一个如何准确输出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更新中断标志               
        }
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
17条回答
热i
1楼-- · 2019-08-14 09:47
C:UsersDunkDesktopHWILE
C:UsersDunkDesktopTIMER
VU情
2楼-- · 2019-08-14 15:14
求指教,我也是捣鼓好几天了,还没有好
刘东君
3楼-- · 2019-08-14 20:48
 精彩回答 2  元偷偷看……
VU情
4楼-- · 2019-08-14 21:23
刘东君 发表于 2017-8-18 15:27
你用示波器测试你输出波形的个数了吗?

那还没有
564646396
5楼-- · 2019-08-15 01:00
主从模式
热i
6楼-- · 2019-08-15 03:10
输出PWM部分照常来,数个问题交给定时器,看你PWM的周期,想要多少个就多少个周期,时间到了就把占空比调到满值就行了

一周热门 更多>