历史上的今天
今天是:2024年09月22日(星期日)
2018年09月22日 | 【STM32电机矢量控制】记录8——ADC三电阻采样
2018-09-22 来源:eefocus
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的不同扇区,电流采样点无大的变化。
史海拾趣
|
伙计们: 作为FPGA初学者,或已经工作,但是接触机会不多,又想学好它的人来说,有一个开发板是不错的。 可是这些人一般不会了解哪个好,那个不好。那就请高手来介绍或者指导买哪家的了。 在此,也强烈建议论坛开展一个diyFPGA开发板的活动… 查看全部问答> |
|
我已经从把摄像头采集的数据保存使用 mmap 内存映射来获取了图像,当用write函数得出的是jpeg格式的 我想得到bmp格式的图片怎么做,跪求,急用。谢谢各位。 … 查看全部问答> |
|
用verilog HDL 实现一个网络加密的算法(md5),有没有哪位高手能给点帮助,我邮箱是poppy220@126.com 先谢过啦!^_^ … 查看全部问答> |
|
附件为在使用STM32外设,进行初始化时,各个外设需要对哪些时钟进行配置的列表。希望大家对该文件的内容多提意见,我们将对其进行修改,使得大家在使用STM32时有所帮助。 相关链接:https://bbs.eeworld.com.cn/upfiles/img/20093/200931217123 ...… 查看全部问答> |
|
最近刚刚开始接触STM32,今天调试串口的时候发现一个很无奈的问题,源代码基本都是使用keil自带的demo,就不列举了。修改以下这些设置:/* PLLCLK = 12MHz * 6= 72 MHz */ RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_6 ...… 查看全部问答> |
|
想扩展个NOR FLASH ,SDRAM,FPGA,想问下各位,能实现吗?我是说都用EPI连接?可是手册上说配EPI的模式不同,如何实现?谢谢。 如果用MCU到FPGA,再到SDRAM,,不就多此一举了吗, 如果用I2C的或者SPI的FLASH,程序是不是得先考到RAM里? … 查看全部问答> |
|
各位大虾: 我的程序是要实现测量PWM的占空比,正常情况下信号为高电平,下降沿开始计时,上升沿结束计时。 但是目前发现这样的问题,就是下降沿能够捕获到,但是上升沿无论如何捕获不到。(前几天,完全同样的程序就是正常的,但是这几天,同样 ...… 查看全部问答> |
|
单片机C语言程序设计实训100例--基于AVR Proteus仿真(完整版) 基于AVRStudio+WinAVR(GCC)组合环境和Proteus硬件仿真平台,精心安排了100个AVR单片机C程序设计案例。全书提供了所有案例完整的C语言源程序,各案例设计了难易适中的实训目标。 ...… 查看全部问答> |





