第一步:
开始定时器+比较值【比较输出-反转电平】
/* 步进电机定时器初始化*/
STEPMOTOR_TIMx_Init();
/* 启动定时器 */
HAL_TIM_Base_Start(&htimx_STEPMOTOR);
/* 启动比较输出并使能中断 */
HAL_TIM_OC_Start_IT(&htimx_STEPMOTOR,TIM_CHANNEL_1);
注意以前用溢出中断的话只需要一句话 HAL_TIM_Base_Start_IT 我们现在是比较中断用上面2句话
第二部:
修改回调函数 修改比较值 即可
void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
{
uint16_t count;
count=__HAL_TIM_GET_COUNTER(&htimx_STEPMOTOR);
__HAL_TIM_SET_COMPARE(&htimx_STEPMOTOR,TIM_CHANNEL_1,count+Toggle_Pulse);
}
A-读出当前计数值比如是200-设置下次计数值为200+220 这样下次计数到420的时候就会匹配,就会滞后一点-----做了2件事情
B-暴力设置当前计数值为0---设置下次计数值为200+20 这样前面计数清零了再次计数比较是在220的时候 滞后一点-做了2件事情
方案B没有技巧 而且如果不需要调频的话 它只需要做一件事 也即是清零即可 更加方便
方案A有草船借鉴的技巧 因为count是U16的是65535的MAX 它给通道送数的时候也就是自动循环的 所以有可能送65535进去
我们在设置定时器的时候就务必要求计数的上限也是65535 也就是
#define STEPMOTOR_TIM_PERIOD 0xFFFF // 定义定时器周期,输出比较模式周期设置为0xFFFF
htimx_STEPMOTOR.Init.Period = STEPMOTOR_TIM_PERIOD; // 定时器周期
这样的波行
---- ------
----- -------
现在关心细节:
__IO uint16_t Toggle_Pulse = 3000; // 比较输出周期,值越小输出频率越快【注定的 越小的话定时器比较翻转越频繁】
需要一个控制这个参数的接口
/**
* 函数功能: 步进电机运动控制
* 输入参数: Dir:步进电机运动方向 0:反转 1正转
* Speed:步进电机速度
* 返 回 值: void
* 说 明: 无
*/
void STEPMOTOR_Motion_Ctrl(uint8_t Dir , uint16_t Speed)
{
uint16_t Step_Delay; //步进延时
if(Speed == 0)
STEPMOTOR_OUTPUT_DISABLE();
else
{
if(Dir==CCW)
STEPMOTOR_DIR_REVERSAL();
else
STEPMOTOR_DIR_FORWARD();//方向控制
//1:步进电机在丝杠上的单步距离--也就是转一下或者说一个脉冲会带来的移动距离【参数最好是它的倍数】
//x = (MPR*α)/2π; MPR:单圈距离 α:步距角
//单步距离的周期
//2:T = C/Ft; C:定时器计数周期 Ft:定时器频率
//∴ V = x/T =(MPR*α*Ft)/(2π*C);
//得 C = (MPR*α*Ft)/(2π*V);
//其中 α = (2π)/spr; spr:步进电机旋转一圈需要的脉冲数
//∴ C= (MPR*Ft)/(spr*V);
//Step_Delay = C/2; 步进电机脉宽
//通过速度计算成延时间隔---我考考距离
Step_Delay = (uint16_t)((MPR_FREQ_SPR_X_10/Speed)>>1);//#define MPR_FREQ_SPR_X_10 (((MPR*T1_FREQ)*10)/SPR) //这里做扩大10倍处理
STEPMOTOR_OUTPUT_ENABLE();
Toggle_Pulse = Step_Delay;
}
}
步进电机设计
猜你喜欢
转载自blog.csdn.net/weixin_42381351/article/details/89953942
今日推荐
周排行