美文网首页我爱编程
JGA25-371电机测试

JGA25-371电机测试

作者: X_xxieRiemann | 来源:发表于2017-08-15 15:56 被阅读0次

    感觉正点原子在STM32开发板这一方面还是比较领先的,主要是教学视频系统,几份pdf都非常良心,程序代码完全是开放的。
    因此用这套系统来学习STM32的人应该很多,在学习过程中看别人的程序,多多少少都有点正点原子里面的程序模板的味道。
    这次我主要是调试一个电机JGA25-371,看看其参数和性能如何,选择的减速比是34。
    电机参数:
    https://item.taobao.com/item.htm?spm=a1z09.2.0.0.1f30a53f712ENL&id=533801305485&_u=d1kvlkda9e09

    电机一共有6条接线。有4条线是用于操作编码器,另外2条用于电机的正负极。这次程序只用到编码器的4条线,电机的转动用手动模拟。首先要确定电机编码器的精度。

    编码器 接线情况
    程序参考:
    http://www.yfrobot.com/forum.php?mod=viewthread&tid=2411&highlight=%B1%E0%C2%EB%C6%F7
    //检测编码器读数函数
    
    #include "sys.h"
    #include "speed_cap.h"
    #include "delay.h"
    /***********************************************************
    371电机速度检测( 编码器)
    蓝绿线为编码器的正负极,不可接反,蓝线接3.3V,绿线接地。
    编码器接口模式 , 速度检测与方向检测
    PA0(TIM2_CH1),接黄线;PA1(TIM2_CH2),接白线。
    ***********************************************************/
    //TIM2_Encoder_Init,Tim2_CH1(PA0);Tim2_CH2(PA1)
    //arr:自动重装值 0XFFFF
    //psc:时钟预分频数    ,不分频
    
    
    void TIM2_Encoder_Init(u16 arr,u16 psc)
    {
        RCC->APB1ENR|=1<<0;       //TIM2时钟使能
        RCC->APB2ENR|=1<<2;       //使能PORTA时钟
        
        GPIOA->CRL&=0XFFFFFF00;   //PA0、PA1 清除之前设置
        GPIOA->CRL|=0X00000044;   //PA0、PA1 浮空输入
            
        TIM2->ARR=arr;            //设定计数器自动重装值 
        TIM2->PSC=psc;            //预分频器
    
        TIM2->CCMR1 |= 1<<0;      //输入模式,IC1FP1映射到TI1上
        TIM2->CCMR1 |= 1<<8;      //输入模式,IC2FP2映射到TI2上
        TIM2->CCER |= 0<<1;       //IC1不反向
        TIM2->CCER |= 0<<5;       //IC2不反向
        TIM2->SMCR |= 3<<0;       //所用输入均在上升沿或下降沿有效
        TIM2->CR1 |= 1<<0;        //使能计数器
    }
    //计数寄存器赋值
    void TIM2_Encoder_Write(int data)
    {
        TIM2->CNT = data;
    }
    //读计数个数
    int TIM2_Encoder_Read(void)
    {
        return (int)((s16)(TIM2->CNT));    //数据类型转换
                             //记录边沿变化次数(几个栅格被记录4次)
    }
    
    //主函数
    
    #include "sys.h"
    #include "usart.h"      
    #include "delay.h"
    #include "speed_cap.h"
    #include "step4988.h"
    #include "led.h"
    
    int main(void)
    {
    
        Stm32_Clock_Init(9); //系统时钟设置
        delay_init(72);      //延时初始化
        uart_init(72,9600);  //串口1初始化
        LED_Init();          //初始化与LED连接的硬件接口
        STEP_Init();         //初始化A4988
        TIM2_Encoder_Init(0xffff, 0); //计数器自动重装值为最大
        TIM2_Encoder_Write(0);
        while(1)
        {
            LED0 = !LED0;
            printf("编码器数值:%d\n ",TIM2_Encoder_Read());//测得转一周,read/34/4,为编码器线数
            delay_ms(100);
            
        }       
    }
    
    串口读数情况

    经过多次测试,电机减速器轴转动一周,串口收到编码器的数据在1850左右,因为电机选择的减速比是34,每一线传感器返回4个脉冲,所以编码器线数大概是1850/34/4=13.6。也就是说每次收到1850的数据时,电机转动360°,因此角度的最小精度为360/1850=0.2°,程序可以控制电机的最小角度为0.2°。

    后来采用驱动板L289N驱动电机,测量每10ms转动的数值,给定电机电压为12V,PWM波恒为1时,读数在370左右,说明电机的转速为120r/min,与产品说明的空载转速126r/min差不多。

    另外发现电机性能不太稳定,在相同PWM波的输出下,读数波动有点大。我们知道,数值每差5就会偏差1°,我们这个项目主要是控制电机转动一定的角度,电机甚至都不用转到1周。
    因此,在减速比的选择上应该选择更大的,毕竟转速不是最重要的,甚至转得慢点反而有好处,这里我的选型出现了失误。

    后话:

    对这个项目来说,我们需要知道电机的绝对位置,而JGA25-371是增量型编码器,通过两个相位相差90°的编码器来读数,获取的数据是相对的。当电源发生断电时,没法用程序矫正回到初始位置,除非再加上传感器来感应原点,但精度和安装都是问题。
    因此,要用绝对式编码器的伺服电机,每个位置都有对应的二进制码,价格就比较贵了。看了松下MINAS A6系列的电机,高达23位的绝对式编码器,还好STM32是32位的,不然编程还要麻烦些,不得不感慨日本的科技水平非常高。

    相关文章

      网友评论

        本文标题:JGA25-371电机测试

        本文链接:https://www.haomeiwen.com/subject/dvgsrxtx.html