×
单片机 > 单片机程序设计 > 详情

【STM32电机矢量控制】记录8——ADC三电阻采样

发布时间:2020-06-09 发布时间:
|

ADC的基本原理:

        ADC,Analog-to-Digital Converter的缩写,指模/数转换器或者模数转换器。是指将连续变化的模拟信号转换为离散的数字信号的器件。

       与之相对应的DAC,Digital-to-Analog Converter,它是ADC模数转换的逆向过程。

STM32中的ADC:

       12位ADC是一种逐次逼近型模拟数字转换器。它有多达18个通道,可测量16个外部和2个内部信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。

ADC的通道概念:

有16个多路通道。可以把转换组织成两组:规则组和注入组。在任意多个通道上以任意顺序进行的一系列转换构成成组转换。

● 规则组  

相当于正常运行的程序

最多使用16个通道。规则通道和它们的转换顺序在ADC_SQRx寄存器中选择。规则组中转换的总数应写入ADC_SQR1寄存器的L[3:0]位中。

规则通道转换的结果保存在规则通道的数据寄存器中。

 

● 注入组  

相当于中断
最多使用4个通道。注入通道和它们的转换顺序在ADC_JSQR寄存器中选择。注入组里的转换总数目应写入ADC_JSQR寄存器的L[1:0]位中。
注入通道转换的结果保存在注入通道的数据寄存器中。


ADC通道:



温度传感器/ VREFINT内部通道

温度传感器和通道ADC1_IN16相连接,内部参照电压VREFINT和ADC1_IN17相连接。可以按注入或规则通道对这两个内部通道进行转换。

 注意: 温度传感器和VREFINT只能出现在主ADC1中。


ADC引脚及配置



单次转换与连续转换:

单次转换完成后不会自动转到另外一个通道的转换,需要手动设置才能启动,连续转换是ADC转换结束后马上就自动启动另一次转换。

扫描模式:只在最后一个通道转换完毕后才会产生EOC或JEOC中断。一般通过DMA读取数据。

ADC的数据对齐方式:因为STM32为12位AD,但寄存器为16位,所以需要选择对齐方式。


ADC的采样时间:ADC_SMPR1和ADC_SMPR2寄存器用来设置通道0到通道17的采样时间。但实际上ADC每个通道都可以独立设置采样时间。

 ADC使用若干个ADC_CLK周期对输入电压采样,采样周期数目可以通过ADC_SMPR1和ADC_SMPR2寄存器中的SMP[2:0]位更改。每个通道可以分别用不同的时间采样。 总转换时间如下计算: TCONV = 采样时间+ 12.5个周期 

例如: 当ADCCLK=14MHz,采样时间为1.5周期

 TCONV = 1.5 + 12.5 = 14周期 = 1μs(最小转换时间)

ADC的库函数:



ADC1的3个通道注入转换配置:

{

ADC_InitTypeDef  ADC_InitStructure;

GPIO_InitTypeDef  GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1  , ENABLE );   //ADC时钟初始化

RCC_ADCCLKConfig(RCC_PCLK2_Div6);//分频因子要确保ADC1 的时钟( ADCCLK)不要超过 14Mhz。当前72/6=12MHz。

GPIO_StructInit(&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1| GPIO_Pin_2| GPIO_Pin_3;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//GPIO设置为模拟输入模式   

GPIO_Init(GPIOA, &GPIO_InitStructure); 

ADC_DeInit(ADC1);  //恢复默认值

//ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//模式选择:独立模式

ADC_InitStructure.ADC_Mode = ADC_Mode_InjecSimult;  //注入模式

ADC_InitStructure.ADC_ScanConvMode = ENABLE;//多通道模拟输入

ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//单次转换

ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//进行软件触发

ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;  //右对齐

ADC_InitStructure.ADC_NbrOfChannel = 1; //规则组通道数 1

ADC_Init(ADC1, &ADC_InitStructure);

ADC_Cmd(ADC1, ENABLE);  //初始化ADC,只是给ADC上电,转换开始需要按照前面的设置触发

//ADC_SoftwareStartConvCmd(ADC1, ENABLE); //软件触发用

ADC_ResetCalibration(ADC1); //复位ADC校准。

while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位完成

ADC_StartCalibration(ADC1);  //校准

while(ADC_GetCalibrationStatus(ADC1));   //等待校准完成

ADC_InjectedSequencerLengthConfig(ADC1,3);  //注入序列长度3

ADC_InjectedChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5 );//通道配置:通道ADC_Channel_1 ,采样时间 采样时间为239.5周期

ADC_InjectedChannelConfig(ADC1, ADC_Channel_2, 2, ADC_SampleTime_1Cycles5 );//通道配置:通道ADC_Channel_2,采样时间 采样时间为1.5周期

ADC_InjectedChannelConfig(ADC1, ADC_Channel_3, 3, ADC_SampleTime_55Cycles5 );//通道配置:通道ADC_Channel_3  采样时间 采样时间为55.5周期

ADC_SoftwareStartConvCmd(ADC1, ENABLE);//软件触发使能       

while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束

 

return ADC_GetConversionValue(ADC1);//返回最近一次转换结果  

主要完成任务:

1、梳理程序的头文件:库的配置文件:stm32f10x_MCconf.h、驱动控制参数:MC_Control_Param.h

状态观测器参数: MC_State_Observer_param.h、永磁同步电机(PMSM)参数:MC_PMSM_motor_param.h

2、梳理三相电阻拓扑电流采集和空间矢量PWM 产生:stm32f10x_svpwm_3 shunt.c 文件中各函数的运行过程

ADC采样程序流程:

1、采样前需要读取三个采样通道的零电流值,以进行传感器校准;

2、ADC经TIM1的4通道进行上升沿实践触发后进入中断,进入起动模式,通过FOC驱动算法获得采样值,用计算出的值Vα、Vβ来判断其所在扇区位置和三相PWM输出的占空比;

ADC采样注意事项:

只有在下桥臂打开时由SVPWM的当前扇区决定该读哪两相电流,而事实上STM32F10x型号的单片机只有两个ADC外设,只能同时采样两相的电流。程序中只采样A、B相电流,C相的电流通过 Ia+Ib+Ic=0 的电机电流关系得出。

每次桥臂开关状态有变化时,会在shunt电阻上的电压产生一个电子干扰,时间长度为TNoise,且当下桥臂打开后,需要等待一段时间来使shunt电阻上的电压达到稳定值,时间长度为TRise,所以在TNoise 及TRise期间不能读相电流;

由于STM32 ADC/TIM1的高性能,我们可以在PWM周期的任意时刻读取电流。当然,我们希望在SVPWM的不同扇区,电流采样点无大的变化。


关键字:STM32  电机  矢量控制  ADC  三电阻采样 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机制作超级流水灯