JGA25-371电机测试

感觉正点原子在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条线,电机的转动用手动模拟。首先要确定电机编码器的精度。

JGA25-371电机测试_第1张图片
编码器

接线情况

程序参考:
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);
        
    }       
}
JGA25-371电机测试_第2张图片
串口读数情况

经过多次测试,电机减速器轴转动一周,串口收到编码器的数据在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电机测试)