感觉正点原子在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位的,不然编程还要麻烦些,不得不感慨日本的科技水平非常高。