电机参数识别-实验数据采集

电机参数识别-实验数据采集

调速系统仿真模型

从仿真模型中可以看出,我们需要实际调速系统的电流,转速值。

转速获取

采用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欧

  1. 计算预期的最大电流: MaxExpected_I = 2A
  2. 计算LSBs 可能值(Min = 15-bit, Max = 12-bit):MinimumLSB = MaxExpected_I/32767=0.000061 (61uA 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

其关键配置的代码如下:

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 ;
}

在这里插入图片描述

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值