我现在想要控制步进电机,那么就需要准确的控制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更新中断标志
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>