【STM32学习】——ADC模数转换器

探索STM32世界:深入理解12位逐次逼近ADC的奥秘


STM32的ADC模块是数据采集的得力助手,12位精度、1us转换速度,16/2路信号源的选择赋予了它广泛的应用潜力。它分为规则组和注入组,规则组支持16通道同步转换,配合DMA可以实现高效数据处理。以STM32F103C8T6为例,它配备了两个独立的ADC模块——ADC1和ADC2,共10个输入通道。


让我们聚焦于STM32的外挂逐次逼近ADC,它拥有8路输入通道,通过逐次逼近算法,精确地比较模拟电压与DAC输出,最终输出编码数据。这个过程由EOC(转换结束)信号、START和CLOCK信号协同控制,VREF+和VREF-则作为参考电压,定义了ADC的输入电压范围。


输入通道不仅包括ADC1的16/17通道,还有ADC2和ADC3的GPIO引脚,灵活的转换模式包括单次、连续扫描和非扫描。在单次转换模式下,用户可以选择特定通道进行精确测量。而在连续转换模式中,无需手动触发,通过序列1自动切换通道,适合连续监测。


触发控制是ADC操作的关键,支持定时器、GPIO引脚和软件触发,只需通过寄存器配置即可实现。数据对齐方面,12位ADC需要16位寄存器,通常以右对齐为主,但也可通过调整对齐方式提升精度。


STM32的ADC确保了采样保持以保证测量精度,采样时间可根据需求调整,量化编码过程在12.5个周期内完成。内置的自校准功能可以有效减少精度误差,建议在系统启动后进行校准。


在硬件电路设计时,如要连接电位器和传感器,需注意电阻选择和电路连接,确保信号质量。例如,通过电阻PA2输入点,可以将0-5V电压调整至0-3.3V,如VIN/50K电阻分压后再通过33K电阻放大。


实战案例一:简化版ADC单通道配置



void AD_Init() {
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
... // GPIO配置为模拟输入
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_SampleTime = ADC_SampleTime_55Cycles5;
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime);
ADC_Init(ADC1, &ADC_InitStructure);
ADC_Cmd(ADC1, ENABLE);
ADC_ResetCalibration(ADC1);
}

在多通道应用中,连续转换模式可以简化为:


AD_ContinuousConvMode = ENABLE;
ADC_SoftwareStartConvCmd(ADC1, ENABLE); // 移至初始化函数

通过四个通道(如PA0电位器和PA1-PA3传感器)进行测量,采用AD_GetValue函数获取每个通道的值,代码示例如下:


uint16_t AD_GetValue(uint8_t ADC_Channel) {
ADC_RegularChannelConfig(ADC1, ADC_Channel, 1, ADC_SampleTime);
return ADC_GetConversionValue(ADC1);
}

在main.c中,实时更新显示四个通道的数据:


```c
#include "stm32f10x.h"
#include "Delay.h"
#include "OLED.h"
#include "AD.h"

uint16_t AD0, AD1, AD2, AD3;

int main(void){
OLED_Init();
AD_Init();
OLED_ShowString(1,1,"AD0:"); OLED_ShowString(2,1,"AD1:"); OLED_ShowString(3,1,"AD2:"); OLED_ShowString(4,1,"AD3:");
while(1){
AD0 = AD_GetValue(ADC_Channel_0); AD1 = AD_GetValue(ADC_Channel_1); AD2 = AD_GetValue(ADC_Channel_2); AD3 = AD_GetValue(ADC_Channel_3);
OLED_ShowNum(1,5,AD0,4); OLED_ShowNum(2,5,AD1,4); OLED_ShowNum(3,5,AD2,4); OLED_ShowNum(4,5,AD3,4);
Delay_ms(100);
}
}

总结

在STM32 ADC的学习之旅中,坚持不懈的探索和实践是关键。通过了解其工作原理和配置,我们可以将它巧妙地融入到各种项目中,提升数据采集的精确性和效率。继续关注,解锁更多STM32的精彩内容,下期再见!


相关系列:




  • 銆怱TM32瀛︿範銆戔斺擜DC妯鏁拌浆鎹㈠櫒
    绛旓細STM32鐨凙DC妯鍧楁槸鏁版嵁閲囬泦鐨勫緱鍔涘姪鎵嬶紝12浣嶇簿搴︺1us杞崲閫熷害锛16/2璺俊鍙锋簮鐨勯夋嫨璧嬩簣浜嗗畠骞挎硾鐨勫簲鐢ㄦ綔鍔涖傚畠鍒嗕负瑙勫垯缁勫拰娉ㄥ叆缁勶紝瑙勫垯缁勬敮鎸16閫氶亾鍚屾杞崲锛岄厤鍚圖MA鍙互瀹炵幇楂樻晥鏁版嵁澶勭悊銆備互STM32F103C8T6涓轰緥锛屽畠閰嶅浜嗕袱涓嫭绔嬬殑ADC妯″潡鈥斺擜DC1鍜孉DC2锛屽叡10涓緭鍏ラ氶亾銆傝鎴戜滑鑱氱劍浜嶴TM32鐨勫...
  • STM32鑺墖鍐呴儴ADC妯鍧楄浆鎹㈣緭鍑虹殑GPIO寮曡剼鎬庢牱閰嶇疆?
    绛旓細1. 閰嶇疆ADC妯鍧 棣栧厛锛岄渶瑕佹墦寮ADC妯″潡锛屽苟璁剧疆鍚堥傜殑鏃堕挓浣胯兘銆侀噰鏍锋椂闂淬佹ā寮忋佸垎杈ㄧ巼绛夊弬鏁帮紝浠ュ強璁剧疆杈撳叆閫氶亾鍜岃Е鍙戞簮銆傚叿浣撲唬鐮佸涓嬶細```c // 浣胯兘ADC鏃堕挓 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC, ENABLE);// ADC鍙傛暟閰嶇疆 ADC_InitTypeDef adc_init;adc_init.ADC_Mode = ADC_Mode_Indep...
  • stm32鐨刟dc妯鍧楁庝箞鐢?
    绛旓細stm32ADC鐨勯氶亾瀵瑰簲寮曡剼濡備笅锛氶氶亾0瀵瑰簲PA0锛岄氶亾1瀵瑰簲PA1锛岄氶亾2瀵瑰簲PA2锛岄氶亾3瀵瑰簲PA3锛屼互姝ょ被鎺ㄣ傞粯璁ら夐」鍖呮嫭PA0鐨刦oot锛孉DC123锛縄N0锛岃繖鎰忓懗鐫褰揚A0杩涜ADC閲囬泦寮曡剼鏃讹紝鍙互浣跨敤ADC1锛2锛3妯″潡鐨刢hannel0銆傚悓鏍稰A1鐨凙DC123锛縄N1鎰忓懗鐫PA1鍙互浣滀负ADC1锛2锛3妯″潡鐨勯氶亾1銆傚叿浣撴潵璇达紝PB0鐨勯粯...
  • stm32涓ADC濡備綍浣跨敤?
    绛旓細stm32 ADC鐨勯氶亾涓庡紩鑴氭槸瀵瑰簲鍏崇郴濡備笅锛氶氶亾0瀵瑰簲PA0锛岄氶亾1瀵瑰簲PA1锛岄氶亾2瀵瑰簲PA2,閫氶亾3瀵瑰簲PA3锛屼互姝ょ被鎺ㄣ侾A0杩欎釜鑴氾紝default閫夐」涓湁 ADC123_IN0锛岃繖涓〃绀篜A0鍋欰DC閲囬泦寮曡剼鏃讹紝鍙互浣跨敤ADC1銆2銆3妯″潡鐨勯氶亾0銆傚悓鏍凤紝PA1鐨凙DC123_IN1锛岃〃绀篜A1鍙互鍋欰DC1銆2銆3妯″潡鐨勯氶亾1銆傜壒鍒殑锛孭B0...
  • stm32鍗曠墖鏈鏈adc鏄粈涔堟剰鎬?
    绛旓細ADC = Analog to Digital Converter锛屾ā鏁拌浆鎹㈠櫒 STM32鍗曠墖鏈哄甫鏈夋ā鏁拌浆鎹㈠櫒锛屼篃灏辨槸璇村畠鍙互灏嗘煇涓鑴氱殑杈撳叆鐢靛帇鎹㈢畻鎴愭暟瀛楅噺锛岃繖瀵逛簬妯℃嫙鍗曞厓鐨勬祴閲忓拰鎺у埗鏄潪甯搁潪甯搁噸瑕佺殑銆
  • STM32F4 ADC妯鍧椾娇鐢ㄤ笉鍚孌MA妯″紡鐨勫尯鍒拰瀵规瘮
    绛旓細1銆STM32F4鏈3涓嫭绔嬬殑ADC鍗曞厓锛屾ц兘寮哄姴锛屽彲浠ョ嫭绔嬩娇鐢紝涔熷彲浠ヨ仈鍚堜娇鐢ㄥ畠浠傝仈鍚堜娇鐢ㄥ湪鍙傝冩墜鍐屼腑鍙獻nterleave妯″紡锛屾渶澶х殑鐩殑鏄姞鍊嶆彁鍗囬噰鏍烽熷害銆2銆侀噰鏍烽熷害澶у箙鎻愰珮浠ュ悗锛屽氨闇瑕佷娇鐢―MA鏉ラ厤鍚堟彁鍙栭噰鏍风粨鏋滐紝浠庤屽彂鎸TM32F4 ADC妯鍧楃殑鏈澶ф晥鑳姐3銆丄DC妯″潡浣跨敤DMA鏈4绉嶆ā寮忓彲閫夛紝榛樿妯″紡鍜屾ā寮1...
  • STM32 ADC璇﹁В
    绛旓細STM32F1鐨勫崟鐗囨満鍐呴儴鑷甫12浣嶇殑ADC澶勭悊鍣紝濡傛灉12浣嶅凡缁忔弧瓒充簡閲囨牱瑕佹眰锛岄偅涔堜笉鐢ㄥ彟澶栨帴鍏DC鑺墖锛堣繖绫昏姱鐗囦竴鑸緢璐碉級锛屽彲浠ュ鎺ョ殑ADC鑺墖姣斿ads1256锛24浣嶏級銆丄D7689锛16浣嶏級銆侫DC鐨勮緭鍏ユ椂閽熶笉寰楄秴杩14MHz锛屽畠鏄敱PCLK2缁忓垎棰戜骇鐢熴傝浆鎹㈡椂鏈蹇负1us锛屽綋ADC鐨勮緭鍏ユ椂閽熻秴杩14MHz 鏃跺叾浼氭崯澶变竴浜涚簿搴...
  • stm32f1adc鍚屾妯″紡娌℃暟鎹
    绛旓細stm32f1adc鍚屾妯″紡娌℃暟鎹搷浣滄楠ゅ涓嬨1銆STM32鐨凙DC鑷甫鍚屾妯″紡锛岃繖绉嶆柟寮忛厤缃湁浜涘鏉傦紝淇″彿澶勭悊鐨勪篃涓嶇洿鎺ャ傚凡鏈夌幇鎴愮殑鏁欑▼浜嗭紝鍐欑殑涓嶉敊锛屾垜灏变笉閲嶅閫犺疆瀛愪簡銆2銆佷互涓や釜ADC鐨勫悓姝ヤ负渚嬶紝灏辨槸ADC1銆丄DC3鍒嗗埆杩涜浜ゆ祦閲囨牱锛岃Е鍙戞簮閫夋嫨鍚屼竴涓畾鏃跺櫒銆
  • stm32鐨凙DC鍔熻兘銆傝鍙栫殑鏄ā鎷熼噺涔?杞寲涓烘暟瀛楅噺杈撳嚭?
    绛旓細STM32鐨凙DC鏄12浣嶇殑绮惧害锛屼篃灏辨槸鏁板瓧閲忕殑鑼冨洿鏄0鑷2^12锛2鐨12娆℃柟锛屼篃灏辨槸12浣嶄簩杩涘埗鏁帮級锛屼篃灏辨槸0~4096锛堝崄杩涘埗锛夈傛墍浠ワ紝閲囨牱鐨勬ā鎷熼噺鏄0~3.3V 鐨勬ā鎷熺數鍘嬶紝瀵瑰簲鐨勬暟瀛楅噺鏄0~4096.銆傝嚦浜庡叿浣撳煎搴斿叧绯伙紝鏄瓑鍒嗙殑锛3.3V琚垎涓4096浠斤紝閲囨牱鍒扮殑鏁板瓧閲忓氨鍙互瀵瑰簲鍒版ā鎷熺數鍘嬩簡銆
  • stm32鐨刟dc浣庝簬0.1v鐨勭數鍘嬫病鏈夊
    绛旓細濡傛灉鍙傝冪數鍘嬭缃笉瓒筹紝鍙兘浼氬鑷碅DC鏃犳硶姝g‘閲囬泦浣庝簬0.1V鐨勭數鍘嬩俊鍙枫2銆佸垎杈ㄧ巼闄愬埗锛STM32鐨凙DC妯鍧楃殑鍒嗚鲸鐜囨槸12浣嶏紝涔熷氨鏄锛屽畠鍙互灏嗚緭鍏ョ數鍘嬭浆鎹负0~4095鐨勬暟瀛楀笺傚浜庝綆浜0.1V鐨勭數鍘嬶紝杞崲鍚庣殑鏁板瓧鍊煎彲鑳戒細闈炲父灏忥紝鐢氳嚦涓0锛岃繖浼氬鑷碅DC鏃犳硶姝g‘閲囬泦浣庝簬0.1V鐨勭數鍘嬩俊鍙枫
  • 本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网