STM32的ADC转换最常见的方式

这里的adc转换也来使用dma---这个也是stm32的adc转换最常见的方式。
第一步是了解stm32的adc对应的gpio口如下图不用记住,可以查询,我是将它剪下来粘贴到书本的相应章节!
第二步是配置相应adc转换的gpio口这里使用pc0--pc1
static void adc1_gpio_config(void)
{
gpio_inittypedef gpio_initstructure;
rcc_ahbperiphclockcmd(rcc_ahbperiph_dma1, enable); //打开dma1的时钟
rcc_apb2periphclockcmd(rcc_apb2periph_adc1 “ rcc_apb2periph_gpioc, enable);
gpio_initstructure.gpio_pin = gpio_pin_0 |gpio_pin_1;
gpio_initstructure.gpio_mode = gpio_mode_ain; //模拟输入
gpio_init(gpioc, &gpio_initstructure);
}
第三步是-配置adc的dma配置adc通道等---
#define adc1_dr_address ((u32)0x40012400+0x4c) //外设地址
__io uint16_t adc_convertedvalue[2];//内存数组
static void adc1_mode_config(void)
{
dma_inittypedef dma_initstructure;
adc_inittypedef adc_initstructure;
dma_deinit(dma1_channel1);
//---------------adc的dma配置--------------------
dma_initstructure.dma_peripheralbaseaddr = adc1_dr_address; //adc1地址---代表adc1保存转换值的寄存器
dma_initstructure.dma_memorybaseaddr = (u32)&adc_convertedvalue;//内存地址---用来保存dma传输过来的adc转换值----后面直接使用的变量地址
dma_initstructure.dma_dir = dma_dir_peripheralsrc; //外设为数据源
dma_initstructure.dma_buffersize = 2; //传输总数据---2通道需要传输2个数据
dma_initstructure.dma_peripheralinc = dma_peripheralinc_disable;//外设地址固定
dma_initstructure.dma_memoryinc = dma_memoryinc_enable;//内存地址自增---总体表示始终从外设adc1地址处取值---依次保存到连续的两个内存变量中---
dma_initstructure.dma_peripheraldatasize = dma_peripheraldatasize_halfword;//外设传输数据单元---半字16位
dma_initstructure.dma_memorydatasize = dma_memorydatasize_halfword; //内存传输数据单元---半字16位
dma_initstructure.dma_mode = dma_mode_circular; //循环模式---2个数据依次循环接收从外设adc1传输过来的adc值---
dma_initstructure.dma_priority = dma_priority_high; //高优先级
dma_initstructure.dma_m2m = dma_m2m_disable; //禁止内存传内存
dma_init(dma1_channel1, &dma_initstructure);
dma_cmd(dma1_channel1, enable); //再次打开dma1
//------------adc模式配置------------------------
adc_initstructure.adc_mode = adc_mode_independent;//独立模式----还有很多模式---这个比较常见
adc_initstructure.adc_scanconvmode = enable ; //扫描模式---采集多通道使用----本程序采集2通道---所以扫描模式
adc_initstructure.adc_continuousconvmode = enable; //连续转换模式---不难理解---就是不停地采集---一次接一次
adc_initstructure.adc_externaltrigconv = adc_externaltrigconv_none; //不使用外部触发转换---触发分为外部触发---比如中断与定时器。软件触发---后面有专用函数
adc_initstructure.adc_dataalign = adc_dataalign_right; //采集的数据右对齐---方便计算
adc_initstructure.adc_nbrofchannel = 2; //总共需要转换的通道个数---这里2个
adc_init(adc1, &adc_initstructure);
rcc_adcclkconfig(rcc_pclk2_div8); //配置adc转换时钟---pclk2的8分频
//下面这个函数比较重要----配置adc的通道与采样周期---前面说的pc0与pc1对应的adc通道分别是--10与11。采集周期也有几种。
adc_regularchannelconfig(adc1, adc_channel_10, 1, adc_sampletime_55cycles5);
adc_regularchannelconfig(adc1, adc_channel_11, 2, adc_sampletime_55cycles5);
adc_dmacmd(adc1, enable); //打开dma1的adc1
adc_cmd(adc1, enable); //打开adc1
adc_resetcalibration(adc1); //复位校准寄存器
while(adc_getresetcalibrationstatus(adc1));//等待校准寄存器复位完成
adc_startcalibration(adc1);//adc校准
while(adc_getcalibrationstatus(adc1));//校准完成
adc_softwarestartconvcmd(adc1, enable);//软件触发转换
}
---第四部分是---在硬件上使用了一个通道切换芯片----cd4052----由pc2---pc3控制通道的选择cd4052切换控制gpio配置----
void gpio_config(void)
{
gpio_inittypedef gpio_initstructure;
rcc_apb2periphclockcmd(rcc_apb2periph_gpioc, enable);
gpio_initstructure.gpio_pin = gpio_pin_2|gpio_pin_3;
gpio_initstructure.gpio_mode = gpio_mode_out_pp; //推完输出
gpio_initstructure.gpio_speed = gpio_speed_50mhz;
gpio_init(gpioc, &gpio_initstructure);
}
---第五部分是---主函数-----
extern __io uint16_t adc_convertedvalue[2];//声明外部变量
uint16_t my_adc[2]; //求平均值
int main(void)
{
u8 i,led=0x01;
usart1_config();
adc1_gpio_config();
adc1_mode_config();
while (1)
{
my_adc[0]=0;
my_adc[1]=0;
for(i=0;i《10;i++)
{
my_adc[0]+=adc_convertedvalue[0];
my_adc[1]+=adc_convertedvalue[1];
}
my_adc[0]=my_adc[0]/10; //采集10次求平均值
my_adc[1]=my_adc[1]/10;
adc_convertedvaluelocal =(float) my_adc[0]/4096*3.3; //转换为电压值
printf(” the current ad---0 value = 0x%04x “, my_adc[0]);
printf(”the current ad---0 value = %f v “,adc_convertedvaluelocal);
adc_convertedvaluelocal =(float) my_adc[1]/4096*3.3;
printf(”the current ad---1 value = 0x%04x “, my_adc[1]);
printf(”the current ad---1 value = %f v “,adc_convertedvaluelocal);

可折叠iPhone或将在2021年推出 弯曲部分无明显折痕
采用英飞凌SP37设计TPMS功能的电动汽车仪表盘系统
使用热敏电阻抑制浪涌电流电路解析
如何实现开关电源的输出电压纹波抑制设计呢?
浅析人工智能伪造技术对社会安全的威胁
STM32的ADC转换最常见的方式
PID控制原理详解
第三代半导体材料,或将成为我国半导体产业发展弯道超车机会
关于索尼CMOS图像传感器芯片IMX400的三层堆叠结构
新小米手机可能会以Mi 10T Lite的形式正式发布
特斯拉公布2020财年第四季度财报
常见的通讯总线连线接口有哪些?
我们该如何选择云数据库MySql的架构版本
Design Considerations for Dall
销售额飙升:汽车MCU的市场走势,你看懂了吗
上海艾为电子技术股份有限公司科创板IPO成功过会
无人机黑飞可能会遇上哪一些大问题
亚航集团正式迎来了首架空客A321neo飞机
rtc通用接口闹钟通用接口的运用精讲
新能源动力汽车用铜箔软连接