2019-08-13 19:53发布
sanv 发表于 2017-10-14 10:59 是啊,主要是还有16细分,编码器是硬件和结构选的,项目也不在意这些浪费。你这个直接走目标步数的方案应 ...
Acuity 发表于 2017-10-14 11:09 编码器不要用Z相,用得不好效果更差;我只用到A、B相,固定周期读取寄存器数值;中断不会导致丢失脉冲数 ...
sanv 发表于 2017-10-14 11:18 STM32编码器模式能够设置读取寄存器的时间吗?我以为是固定的呢?请教如何设置谢谢。
Acuity 发表于 2017-10-14 11:28 我指的不是这个意思,是你的应用程序定时去获取这个寄存器的的脉冲值,然后处理。
最多设置5个标签!
编码器不要用Z相,用得不好效果更差;我只用到A、B相,固定周期读取寄存器数值;中断不会导致丢失脉冲数 啊,脉冲计算是单片机内部硬件自动计算的,只是你读取其脉冲数的周期决定你的实时性;无须时时刻刻读取,一般根据你电机最大转速来估算一个读取周期,比如10ms或者1ms读取周期即可,保证一个读取周期内单片机定时器计数不溢出(16位定时器);
STM32编码器模式能够设置读取寄存器的时间吗?我以为是固定的呢?请教如何设置谢谢。
贴上我设置TIM5编码器模式的代码
void TIM5_Encoder_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);
TIM_DeInit(TIM5);
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);//时间基数单位初始化为默认值。
TIM_TimeBaseStructure.TIM_Period = 14396;//3600*4 -4,计数器预装载值。完成一圈时的总计数值。
TIM_TimeBaseStructure.TIM_Prescaler = 0;//预分频系数为0,即不进行预分频
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//设置时钟分割 T_dts = T_ck_int
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//TIM向上计数
TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);
TIM_EncoderInterfaceConfig(TIM5, TIM_EncoderMode_TI12, TIM_ICPolarity_BothEdge ,TIM_ICPolarity_BothEdge);//使用编码器模式3,上升下降都计数(4倍频)
TIM_ICStructInit(&TIM_ICInitStructure);//将结构体中的内容缺省输入
TIM_ICInitStructure.TIM_ICFilter = 4;//选择输入比较滤波器
TIM_ICInit(TIM5, &TIM_ICInitStructure);
TIM5->CNT = 0;
TIM_Cmd(TIM5,ENABLE);
}
这样设置完TIM5->CNT的读取时间如何设置?还有读取TIM5->CNT的时候是否可以通过设置中断优先级之类的调整读取先后顺序?
我指的不是这个意思,是你的应用程序定时去获取这个寄存器的的脉冲值,然后处理。
我是想在步进电机运行相应步数之后去读取这个TIM5->CNT的值和初始化时候的读值进行比较。发现有偏差,经过验证编码器计数应该向你说的一样是硬件读取的,MCU产生中断什么的不影响计数,出现差错应该是其他地方的问题,我找找原因。稍后结贴给悬赏分。谢谢。
一周热门 更多>