请教一个如何准确输出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-16 02:25
 精彩回答 2  元偷偷看……
热i
2楼-- · 2019-08-16 06:50
VU情 发表于 2017-8-25 22:21
恩,就是时间到,关定时器对不对?

时间到了关PWM,定时器是更新中断,不用管
VU情
3楼-- · 2019-08-16 09:38
564646396 发表于 2017-8-26 10:06
初始化问题

应该怎么初始化呢
564646396
4楼-- · 2019-08-16 15:28
http://www.openedv.com/forum.php?mod=viewthread&tid=100333      这个是主从 我的是STM32F103的  
  你看着改
VU情
5楼-- · 2019-08-16 20:00
564646396 发表于 2017-8-26 13:44
http://www.openedv.com/forum.php?mod=viewthread&tid=100333      这个是主从 我的是STM32F103的  
  你 ...

谢谢啦,再请教一个问题,串口助手发送的数据,如何直接拿来用啊?就是可以当做数值进行计算的

一周热门 更多>