初级会员

- 积分
- 55
- 金钱
- 55
- 注册时间
- 2017-8-14
- 在线时间
- 22 小时
|
1金钱
我想要实现的功能是电机正转N秒打开阀门开关,转一圈64个脉冲的霍尔编码器计数,然后加压设备通过阀门加压,传感器采集压强值。当到达设定值时,电机反转霍尔编码器的计数值,阀门关闭(这是电机淘宝链接https://item.taobao.com/item.htm ... amp;_u=p1lt4msm2078,选的是12V 50R/Min的电机)。AB相的编码器,正转的脉冲和反转的脉冲相差。图片里面是我测得的数值,图片下方是我给反转多加了129个脉冲。/*电机PWM设置*/
void PWM_SET1(u8 dir,u16 a) //PWN控制电机驱动,匀速转动,a为恒定值,正转反转一样
{
if(dir==1) //正转
{
TIM_SetCompare4(TIM8,0);
TIM_SetCompare3(TIM8,a);
dir=0;
}
else {
TIM_SetCompare3(TIM8,0); //反转
TIM_SetCompare4(TIM8,a);
dir=1;
}
}
/*电机正转,输出脉冲值 */
PWM_SET1(1,300);
delay_s(2);
PWM_SET1(0,0); //获取先前的计数值
printf("EncCntAAAA = %d-------",EncCnt);
closeb=EncCnt; // EncCnt= hEncoder_Timer_Overflow * 64 + TIM3->CNT,closeb为反转圈数
hEncoder_Timer_Overflow=0; //hEncoder_Timer_Overflow为电机转一圈的脉冲数
EncCnt=0;
/*电机反转,输出脉冲值 */
PWM_SET1(0,300);
out: if(closeb>=(EncCnt+129)) ///判断反转脉冲个数是否达到正转脉冲值,加了129后脉冲数输出差不多
{ goto out; }
PWM_SET1(0,0);
printf("EncCntBBBB = %d\r\n",EncCnt);
hEncoder_Timer_Overflow=0;
EncCnt=0;
choose=0;
试了下,感觉电机反转的值比正转多一点点。这样设置的话,反转脉冲数数是和正转脉冲数作比较,但反转时的脉冲数由于是重新测得,值可能和正转测得的有误差,想请教下,如何设置确保阀门开关关闭完全呢。我想的是用传感器采集的压强值作为标准判断是否关闭,但我测得的压强值在跳动,不是很准,测量如下,用哪种方法可以提高压强值的精度呢,之前试过用中值法,但数据输出太慢了,现在用的是平均值法,效果不咋地
float T_Get_Adc_Average(u8 ch,u8 times)
{
float temp_val=0;
u16 t;
for(t=0;t<times;t++)
{
temp_val+=T_Get_Adc(ch);
delay_ms(25);
}
temp_val=temp_val/times;
return temp_val;
}
presure=(float)(T_Get_Adc_Average(ADC_CH_TEMP1,8)*3300)/(float)4095; //ADC采集的电压值
if(presure>=vol||vol==0) //通过加减电压值调零点
presure=(presure-vol)*1.6;
else
presure=(vol-presure)*1.6;
|
-
|