STM32实现双通道ADC采集电压电流值
本次的实验是通过配置DMA来获取ADC采集到的数据的。
软件实现如下:
adc.c文件
#include "adc.h"#define ADC1_DR_Address ((u32)0x40012400+0x4c) //定义ADC1地址volatile uint16_t ADCConvertedValue[2]; //定义内存地址数组 float AD_Value[2];static void ADC1_GPIO_Config(void) {GPIO_InitTypeDef GPIO_InitStructure;/* Enable ADC1 and GPIOC clock */RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOB, ENABLE);/* Configure PC.01 as analog input */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 |GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;GPIO_Init(GPIOB, &GPIO_InitStructure); // PB0,PB1 ,输入时不用设置速率 }static void ADC1_DMA_Config(void) {DMA_InitTypeDef DMA_InitStructure;/* DMA channel1 configuration */RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE); //使能DMA传输 DMA_DeInit(DMA1_Channel1);DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&(ADC1->DR); //ADC地址DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADCConvertedValue; //内存地址DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;DMA_InitStructure.DMA_BufferSize = 2; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址固定DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址不固定DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //半字DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //循环传输DMA_InitStructure.DMA_Priority = DMA_Priority_High;DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;DMA_Init(DMA1_Channel1, &DMA_InitStructure); }static void ADC1_Config(void) {/* ADC1 configuration */ADC_InitTypeDef ADC_InitStructure;ADC_DeInit(ADC1);RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE); //使能ADC1时钟ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //独立ADC模式ADC_InitStructure.ADC_ScanConvMode = ENABLE; //启动扫描模式,扫描模式用于多通道采集ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //开启连续转换模式,即不停地进行ADC转换ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //不使用外部触发转换ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //采集数据右对齐ADC_InitStructure.ADC_NbrOfChannel = 2; //要转换的通道数目2ADC_Init(ADC1, &ADC_InitStructure);/*配置ADC时钟,为PCLK2的6分频,即12Hz*/RCC_ADCCLKConfig(RCC_PCLK2_Div6); /*配置ADC1的通道8,9为239.5个采样周期,序列为1,2*/ ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1 , ADC_SampleTime_239Cycles5);ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 2 , ADC_SampleTime_239Cycles5);/* Enable ADC1 DMA */ADC_DMACmd(ADC1, ENABLE); /* Enable ADC1 */ADC_Cmd(ADC1, ENABLE);/*复位校准寄存器 */ ADC_ResetCalibration(ADC1);/*等待校准寄存器复位完成 */while(ADC_GetResetCalibrationStatus(ADC1)); /* ADC校准 */ADC_StartCalibration(ADC1);/* 等待校准完成*/while(ADC_GetCalibrationStatus(ADC1)); }void adc1_start(void) {ADC_SoftwareStartConvCmd(ADC1, ENABLE); //ADC1软计启动DMA_Cmd(DMA1_Channel1, ENABLE); //使能DMA通道1 }void ADC1_Init(void) {ADC1_GPIO_Config();ADC1_DMA_Config();ADC1_Config(); }
adc.h文件
#ifndef __ADC_H #define __ADC_H#include <stm32f10x.h>void ADC1_Init(void); void adc1_start(void);#endif /*ADC_H*/
main.c文件
#include "adc.h"extern volatile uint16_t ADCConvertedValue[2]; //定义内存地址数组 extern float AD_Value[2];int main(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断优先级组为组2,2位抢占优先级,2位响应优先级USART1_Int(); //串口初始化 ADC1_Init(); //ADC1初始化 adc1_start();SysTick_Init(); //系统时钟初始化while(1){ AD_Value[0]=(float)ADCConvertedValue[0]/4096*3.3; //获取电压值AD_Value[1]=(float)ADCConvertedValue[1]/4096*3.3; //获取电流值 printf("\r\n电压值为:%f V\r\n",AD_Value[0]);printf("\r\n电流值为:%f A\r\n",(AD_Value[1]-2.5)/0.185);} }
本次实验的电流采集模块用的是ACS712模块,所以在打印输出时需要转换一下。
转载于:https://www.cnblogs.com/lucky-3/p/11269835.html
STM32实现双通道ADC采集电压电流值相关推荐
- 基于STM32F407使用ADC采集电压实验
核心板:STM32F407 实验目的:使用ADC采集电压值将其打印在串口助手上 目录 ADC简介 STM32F407 ADC通道对应的引脚 STM32F407中的数据寄存器 ADC 规则数据寄存器 ( ...
- 小壁虎EFM32之ADC 采集电压
前言 最近在学习小壁虎EFM32芯片的使用,需要用ADC采集电压,学习之中,遇到一些小问题和需要注意的地方,现将其记录下来,避免以后自己再次踩坑和往后可以学而时习之:好了,进入正题. 代码 主函数: ...
- Arduino Uno 使用 ADC采集电压在LCD上显示
Arduino Uno 使用 ADC采集电压显示在LCD上 前言 所需组件 电路图及说明 Arduino使用ADC 代码 前言 在本教程中,我们将在 ARDUINO UNO 中介绍 ADC(模数转换) ...
- 蓝桥杯嵌入式模板的构建——STM32G431RB(LCD和ADC采集电压)
基于LED和按键的模板来写的 下载工程的链接 蓝桥杯嵌入式模板的构建--STM32G431RB(LED和按键的配置)-其它文档类资源-CSDN下载这个模板亲测有效只写了按键三和按键4对LED进行点灯和 ...
- STM32 - ADC采集电压 中断处理
一.参考电压 VDD接入电压为3.3V ADC供电要求:2.4V到3.6V 注意:STM32的100脚以上(含100脚)有参考电压引脚.在没有参考电压引脚的单片机上,可以把基准电压芯片接入VDDA,但 ...
- STM32物联网项目-ADC采集实验板板温度(NTC热敏电阻)
STM32 ADC采集板载温度 STM32 ADC简介 STM32 拥有 1~3 个 ADC(STM32F101/102 系列只有 1 个 ADC),这些 ADC 可以独立使用, 也可以使用双重模 ...
- LPC1768 双通道ADC采集数据并发送
实验需要用到两个ADC同时采集电压信号.LPC1768有8个通道的ADC,这次实验中使用了P0.23引脚的AD0[0]和P0.26引脚的AD0[3].在实验中用的是uCOS-II操作系统,设计了两个任 ...
- GD32 ADC采集电压
文章目录 ADC TIM DMA 其他一些初始化 main 总结 使用芯片为GD32F307 ADC 连续转换模式,可以运行在规则组通道上,一旦相应软件触发或者外部触发产生,ADC就会采样和转换规定的 ...
- 单片机 ADC采集电压
单片机:N76E003 /********************************************* 函数名:Adc_Configuration 功 能:ADC初始化配置 形 参: 返 ...
最新文章
- 移除单链表的倒数第N个节点
- 有的时候入门只是一瞬间
- UI设计师必知:link和@import引用css文件方法的区别
- 电商美工手里没有C4D素材模板,不能体现有多厉害
- 基于Huffman树的CBOW模型的理解
- [转载] C++学习之异常处理详解
- HDU 1527 取石子游戏
- 在MyEclipse中安装SVN插件subclipse
- C语言链表详解(通俗易懂)
- cad怎么表示出一个孔_AutoCAD如何画一个带孔的立体球
- 服装制图软件测试初学者,服装行业版软件测试方案.ppt
- 畅想X9BYOD式的生活
- 九龙证券|服务器龙头获资金连续抢筹,尾盘主力抢筹前期大热门股
- 金融 python 招聘,滴滴、度小满金融python工程师社招面经
- 计算机应用基础课程的评价方法,对计算机应用基础课程评价方法探讨.doc
- 短线绝招--潜龙出海
- scal数组: 化整为多,取出单个元素
- 面试-Java【之】(revers)递归实现字符串倒序排列(详解)
- 计算机网络原理课后作业答案,自考04741《计算机网络原理》课后习题答案
- 鲁大师5月新机性能/流畅榜:中兴Axon 40 Ultra性能夺冠,特供版新机扎堆了!