电机参数识别-实验数据采集
从仿真模型中可以看出,我们需要实际调速系统的电流,转速值。
转速获取
采用13线磁编码器,通过正交解码的方式获取转速
磁编码器有两个脉冲输出:A相和B相,并且两个相位永远存在90°相位差。可以根据AB相脉冲信号数量测得速度,位移等。STM32自带3种编码器模式,分别是仅在A相计数,仅在B相计数,A相,B相同时计数。本次采用A相,B相同时计数模式。图解如下:
- 1时刻:TI2为低电平,TI1上升沿跳变,计数器向上计数;
- 2时刻:TI1为高电平,TI2上升沿跳变,计数器仍然向上计数;
- 3时刻:TI2为高电平,TI1下降沿跳变,计数器仍然向上计数;
- 4时刻:TI2为低电平,TI2下降沿跳变,计数器仍然向上计数。
本次设计,将TIM2配置为编码器接口模式:
其关键代码如下
/**************************************************************************
函数功能:把TIM2初始化为编码器接口模式
入口参数:无
返回 值:无
**************************************************************************/
void Encoder_Init_TIM2(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//使能定时器4的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; //端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOA
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.TIM_Prescaler = 0x0; // 预分频器
TIM_TimeBaseStructure.TIM_Period = ENCODER_TIM_PERIOD; //设定计数器自动重装值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//选择时钟分频:不分频
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM向上计数
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);//使用编码器模式3
TIM_ICStructInit(&TIM_ICInitStructure);
TIM_ICInitStructure.TIM_ICFilter = 10;
TIM_ICInit(TIM2, &TIM_ICInitStructure);
TIM_ClearFlag(TIM2, TIM_FLAG_Update);//清除TIM的更新标志位
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
//Reset counter
TIM_SetCounter(TIM2,0);
TIM_Cmd(TIM2, ENABLE);
}
每个20ms获取一次脉冲,并转化为转速
speed=(int)(((TIM2->CNT))*1.925); //速度采集
TIM2->CNT=0;
电流获取
电流传感器采用INA219,其特性如下
-
测量总线电压范围:0v~36v
-
可测量电流、电压、功率;
-
电流、总线电压、功率的独立警报阈值;
-
兼容I2C、SMBus、PMBus接口的1.8v电压;
-
供电电压:2.7v~5.5v
-
内部具有五个寄存器用于配置INA219,存储电流、总线电压、功率数据,超阈值数据。
其电路图如下:
INA219的寄存器
由于INA219采用IIC通信,需要配置它的寄存器
INA219具有五个寄存器:配置寄存器,总线电压寄存器,功率寄存器,电流寄存器,基准值存放寄存器。本次主要使用它检测电流,因此和电流 无关的寄存器不配置
配置寄存器
-
bit13:设置检测最大检测电压;
-
bit11,bit12:设置总线分流电阻最大的电压,后面用于计算最大检测电流;
-
bit7-bit10:设置总线电压ADC分辨率;
-
bit3- bit 6:设置分路ADC分辨率;
-
bit0- bit 2:设置工作模式;
电流寄存器
基准值存放寄存器
配置流程
本次利用INA219的最大总线电压32V,能测量的最大电流为2A,采样电阻为0.1欧
- 计算预期的最大电流: MaxExpected_I = 2A
- 计算LSBs 可能值(Min = 15-bit, Max = 12-bit):MinimumLSB = MaxExpected_I/32767=0.000061 (61uA per bit)
- 在最小值和最大值之间选择一个LSB (最好是接近MinLSB的舍入数)所以,CurrentLSB = 0.0001 (100uA per bit)
- 计算校准寄存器:Cal = trunc (0.04096 / (Current_LSB * 电阻值)):cal=0.04096/(0.0001*0.1)=4096=0x1000
其关键配置的代码如下:
void INA219_SET_32V_2A(void)
{
u16 config;
//VBUS_MAX = 32V (Assumes 32V, can also be set to 16V)
// VSHUNT_MAX = 0.32 (Assumes Gain 8, 320mV, can also be 0.16, 0.08, 0.04)
//电阻=0.1
//MaxPossible_I = VSHUNT_MAX / 电阻值
// MaxPossible_I = 3.2A
/***************************
计算 ina219_calValue的步骤
1. 设置预期最大电流: MaxExpected_I = 2.0A
2. 计算LSBs 可能值(Min = 15-bit, Max = 12-bit)
MinimumLSB = MaxExpected_I/32767=0.000061 (61uA per bit)
MaximumLSB = MaxExpected_I/4096= 0.000488 (488uA per bit)
3. 在最小值和最大值之间选择一个LSB (最好是接近MinLSB的舍入数)
CurrentLSB = 0.0001 (100uA per bit)
4. 计算校准寄存器:Cal = trunc (0.04096 / (Current_LSB * 电阻值))
cal=0.04096/(0.0001*0.1)=4096=0x1000
*********************************/
ina219_calValue = 4096;
/*********************************
5. 计算功率LSB:PowerLSB = 20 * CurrentLSB
PowerLSB = 20 * 0.0001=0.002 (2mW per bit)
6. 计算溢出前的最大电流和分流电压值
Max_Current = Current_LSB * 32767=0.0001*32767=3.2767A(最大电流)
如果最大电流超过可能的最大电流,溢出电流=可能最大电流
否则,溢出电流=最大电流
所以:Max_Current_Before_Overflow=3.2A
Max_ShuntVoltage = Max_Current_Before_Overflow * 电阻=3.2*0.1=0.32V
7. 计算最大功率:Max_Current_Before_Overflow * 最大总线电压=0.32V*32=102.4W
设置电流,功率转换基址:
**********************************/
ina219_currentDivider_mA = 10; // Current LSB = 100uA per bit (1000/100 = 10)
ina219_powerDivider_mW = 2; // Power LSB = 1mW per bit (2/1)
//将校准寄存器设置为上面计算出的“ Cal”
ina219_Write_Register(INA219_REG_CALIBRATION, ina219_calValue) ;
//设置配置寄存器以考虑上述设置
config = INA219_CONFIG_BVOLTAGERANGE_32V |
INA219_CONFIG_GAIN_8_320MV |
INA219_CONFIG_BADCRES_12BIT |
INA219_CONFIG_SADCRES_12BIT_1S_532US |
INA219_CONFIG_MODE_SANDBVOLT_CONTINUOUS;
ina219_Write_Register(INA219_REG_CONFIG, config);
}
电流值的获取:
//获取原始电流值
s16 INA219_getCurrent_raw()
{
u16 value;
//防止 剧烈的负载会重置INA219,重新配置下
ina219_Write_Register(INA219_REG_CALIBRATION, ina219_calValue) ;
ina219_Read_Register(INA219_REG_CURRENT, &value);
return (s16)value;
}
//以mA为单位获取电流值
float INA219_getCurrent_mA(void)
{
float valueDec;
valueDec=INA219_getCurrent_raw();
valueDec /= ina219_currentDivider_mA;
return valueDec ;
}
//以mA为单位获取电流值
float INA219_getCurrent_mA(void)
{
float valueDec;
valueDec=INA219_getCurrent_raw();
valueDec /= ina219_currentDivider_mA;
return valueDec ;
}