介绍一种关于STM32 ADC 多通道16路电压采集技术

介绍一种关于STM32 ADC 多通道16路电压采集技术,第1张

下面介绍一种利用STM32单片机制作的16路多通道ADC采集电路图和源程序。采用USB接口与电脑连接,实则USB转串口方式,所以上位机可以用串口作为接口。电路图中利用LM324作为电压跟随器,起到保护单片机引脚的作用。直接在电脑USB取点,省去外接电源麻烦,实测耗电电流不到20ma.

1.主控电路图:

介绍一种关于STM32 ADC 多通道16路电压采集技术,介绍一种关于STM32 ADC 多通道16路电压采集技术,第2张

2. USB转串口电路图

介绍一种关于STM32 ADC 多通道16路电压采集技术,介绍一种关于STM32 ADC 多通道16路电压采集技术,第3张

3.LM324电压跟随器电路图

介绍一种关于STM32 ADC 多通道16路电压采集技术,介绍一种关于STM32 ADC 多通道16路电压采集技术,第4张

4.滤波电路图

介绍一种关于STM32 ADC 多通道16路电压采集技术,介绍一种关于STM32 ADC 多通道16路电压采集技术,第5张

5.16路接口电路图

介绍一种关于STM32 ADC 多通道16路电压采集技术,介绍一种关于STM32 ADC 多通道16路电压采集技术,第6张

6.电源电路图

介绍一种关于STM32 ADC 多通道16路电压采集技术,介绍一种关于STM32 ADC 多通道16路电压采集技术,第7张

7.16路ADC初始化程序:

voidAdc_Init(void)

{

//先初始化IO口

RCC-》APB2ENR|=0X7《《2;//使能PORTA\PORAB\PORTC口时钟

GPIOA-》CRL&=0X00000000;//PA01234567anolog输入

GPIOB-》CRL&=0XFFFFFF00;//PB01anolog输入

GPIOC-》CRL&=0XFF000000;//PC012345anolog输入

//通道10/11设置

RCC-》APB2ENR|=1《《9;//ADC1时钟使能

RCC-》APB2RSTR|=1《《9;//ADC1复位

RCC-》APB2RSTR&=~(1《《9);//复位结束

RCC-》CFGR&=~(3《《14);//分频因子清零

//SYSCLK/DIV2=12MADC时钟设置为12M,ADC最大时钟不能超过14M!

//否则将导致ADC准确度下降!

RCC-》CFGR|=2《《14;

ADC1-》CR1&=0XF0FFFF;//工作模式清零

ADC1-》CR1|=0《《16;//独立工作模式

ADC1-》CR1&=~(1《《8);//非扫描模式

ADC1-》CR2&=~(1《《1);//单次转换模式

ADC1-》CR2&=~(7《《17);

ADC1-》CR2|=7《《17;//软件控制转换

ADC1-》CR2|=1《《20;//使用用外部触发(SWSTART)!!!必须使用一个事件来触发

ADC1-》CR2&=~(1《《11);//右对齐ADC1-》SQR1&=~(0XF《《20);

ADC1-》SQR1&=0《《20;//1个转换在规则序列中也就是只转换规则序列1

//设置通道采样时间

ADC1-》SMPR2&=0X00000000;//通道0,1,2,3,4,5,6,7,8,9采样时间清空

ADC1-》SMPR2|=7《《27;//通道9239.5周期,提高采样时间可以提高精确度

ADC1-》SMPR2|=7《《24;//通道8239.5周期,提高采样时间可以提高精确度

ADC1-》SMPR2|=7《《21;//通道7239.5周期,提高采样时间可以提高精确度

ADC1-》SMPR2|=7《《18;//通道6239.5周期,提高采样时间可以提高精确度

ADC1-》SMPR2|=7《《15;//通道5239.5周期,提高采样时间可以提高精确度

ADC1-》SMPR2|=7《《12;//通道4239.5周期,提高采样时间可以提高精确度

ADC1-》SMPR2|=7《《9;//通道3239.5周期,提高采样时间可以提高精确度

ADC1-》SMPR2|=7《《6;//通道2239.5周期,提高采样时间可以提高精确度

ADC1-》SMPR2|=7《《3;//通道1239.5周期,提高采样时间可以提高精确度

ADC1-》SMPR2|=7《《0;//通道0239.5周期,提高采样时间可以提高精确度

ADC1-》SMPR1&=0XFFFC0000;//通道10,11,12,13,14,15采样时间清空

ADC1-》SMPR1|=7《《15;//通道15239.5周期,提高采样时间可以提高精确度

ADC1-》SMPR1|=7《《12;//通道14239.5周期,提高采样时间可以提高精确度

ADC1-》SMPR1|=7《《9;//通道13239.5周期,提高采样时间可以提高精确度

ADC1-》SMPR1|=7《《6;//通道12239.5周期,提高采样时间可以提高精确度

ADC1-》SMPR1|=7《《3;//通道11239.5周期,提高采样时间可以提高精确度

ADC1-》SMPR1|=7《《0;//通道10239.5周期,提高采样时间可以提高精确度

ADC1-》CR2|=1《《0;//开启AD转换器

ADC1-》CR2|=1《《3;//使能复位校准

while(ADC1-》CR2&1《《3);//等待校准结束

//该位由软件设置并由硬件清除。在校准寄存器被初始化后该位将被清除。

ADC1-》CR2|=1《《2;//开启AD校准

while(ADC1-》CR2&1《《2);//等待校准结束

//该位由软件设置以开始校准,并在校准结束时由硬件清除

}

8.获取ADC值的程序:

//获得ADC值

//ch:通道值1~16

u16Get_Adc(u8ch)

{

u8ch_ch;

switch(ch)

{

case1:ch_ch=8;break;

case2:ch_ch=9;break;

case3:ch_ch=14;break;

case4:ch_ch=15;break;

case5:ch_ch=6;break;

case6:ch_ch=7;break;

case7:ch_ch=4;break;

case8:ch_ch=5;break;

case9:ch_ch=2;break;

case10:ch_ch=3;break;

case11:ch_ch=1;break;

case12:ch_ch=0;break;

case13:ch_ch=12;break;

case14:ch_ch=13;break;

case15:ch_ch=11;break;

case16:ch_ch=10;break;

default:ch_ch=88;break;

}

if(ch_ch==88)return0;

//设置转换序列

ADC1-》SQR3&=0XFFFFFFE0;//规则序列1通道ch

ADC1-》SQR3|=ch_ch;

ADC1-》CR2|=1《《22;//启动规则转换通道

while(!(ADC1-》SR&1《《1));//等待转换结束

returnADC1-》DR;//返回adc

}

9.把ADC值转换成电压值的函数:

//ch范围1~16

voidfetch_adc(u8ch)

{

u16adcx;

u32temp;

if((ch==0)||(ch》16))return;//如果不是1到16,通道无效,退出函数

adcx=Get_Adc(ch);// 获得ADC值

temp=(u32)adcx*3300/4096;//计算电压值单位mv

adcx=temp;//获得计算出的电压值

adc_buf[ch*2-2]=adcx》》8;//给adc_buf赋值,先赋高8位,后赋低8位

adc_buf[ch*2-1]=adcx;

}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/dianzi/2642143.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-08-12
下一篇 2022-08-12

发表评论

登录后才能评论

评论列表(0条)

保存