基于STM32F103C8T6ADC检测交流电压
上篇文章写了硬件部分的实现思路,通过采样电阻的到小电压后经过二级放大电路得到单片机可处理的交流电压,此文介绍了如何采用单片机采集交流电压以及stm32ADC外设的使用。首先是硬件电路部分。
电路没有采用核心板,而是直接将芯片焊接到主板上,采用type-c接口供电,调参采用五轴按键,参数及测量结果显示采用0.96寸OLED显示,采用有源蜂鸣器作为报警电路。PCB如图所示
交流电压经放大后到达ADC口,此时即可进行ADC采样。
ADC采样采用DMA的方式,初始化主要有两个方面:
一:GPIO的初始化
static void ADCx_GPIO_Config(void)
{GPIO_InitTypeDef GPIO_InitStructure;//打开 ADC IO 端口时钟ADC_GPIO_APBxClock_FUN(ADC_GPIO_CLK,ENABLE);//配置ADC IO 引脚模式//必须为模拟输入GPIO_InitStructure.GPIO_Pin = ADC_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//初始化ADC IOGPIO_Init(ADC_PORT,&GPIO_InitStructure);
}
二:DMA的初始化
static void ADCx_Mode_Config(void)
{DMA_InitTypeDef DMA_InitStructure;//打开DMA时钟RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE); //复位DMADMA_DeInit(ADC_DMA_CHANNEL);DMA_InitStructure.DMA_PeripheralBaseAddr = ( uint32_t ) ( & (ADC_x->DR ) );DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADC_ConvertedValue;DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;DMA_InitStructure.DMA_BufferSize = 1;DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//Normal是一直传输DMA_InitStructure.DMA_Priority = DMA_Priority_High;DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;DMA_Init(ADC_DMA_CHANNEL,&DMA_InitStructure);DMA_Cmd(ADC_DMA_CHANNEL,ENABLE);ADC_InitTypeDef ADC_InitStruct;ADC_APBxClock_FUN ( ADC_CLK, ENABLE );ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;ADC_InitStruct.ADC_ScanConvMode = DISABLE;ADC_InitStruct.ADC_ContinuousConvMode = ENABLE; //一直转换ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //软件触发ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right; //右对齐ADC_InitStruct.ADC_NbrOfChannel = 1; //转换通道为一个 ADC_Init(ADC_x, &ADC_InitStruct);RCC_ADCCLKConfig(RCC_PCLK2_Div8);ADC_RegularChannelConfig(ADC_x, ADC_CHANNEL,1, ADC_SampleTime_55Cycles5);//使能ADC DMA请求ADC_DMACmd(ADC_x,ENABLE);ADC_Cmd(ADC_x,ENABLE);//校准ADCADC_StartCalibration(ADC_x);//等待校准完成while(ADC_GetCalibrationStatus(ADC_x));//采用软件触发ADC_SoftwareStartConvCmd(ADC_x,ENABLE);
}
此时采用DMA传输,ADC采样使用软件触发。在这里我的理解是只要ADC一个周期转换完成即开始下一次转换。DMA时刻在更新变量的值。
u16 ch_rms_value(void)
{u32 sum = 0;u32 value[200] = {0};u16 rms = 0;u16 i = 0;float squ = 0;for(i = 0; i < 200; i++) //20ms 采样200个点{value[i] = ADC_ConvertedValue;delay_us(100);}for(i = 0; i < 200; i++){squ= __fabs(value[i] - 2085.236);sum += squ*squ;}rms = mySqrt(sum / 200); //求均方根值return rms;
}
计算交流电压主要是均方根算法,因交流电压为市电50Hz,故我们选择在20ms的周期内采样200个点。采用的算法是简单的delay 100us然后采样二百个。在精度要求不高的情况下是可以接受的,若精度要求较高可以自行写在中断中自动读取。具体的工程可在主页中获取
基于STM32F103C8T6ADC检测交流电压相关推荐
- stm32采集交流电压信号_基于STM32的交流电压检测.pdf
第24卷第13期 电子设计工程 2016年7月 V01.24 No.13 Electronic Jul.2016 DesignEngineering 基于STM32的交流电压检测 任宏斌,冷建伟 (天 ...
- 基于瞳孔检测,湖北中学推出人脸支付!网友提出安全投诉,学校:符合法规,无风险...
来源:大数据文摘 本文约2500字,建议阅读6分钟 本文介绍了湖北中学使用瞳孔检测的情况. 试想,当你在学校准备去吃饭,来到食堂,刷一下脸,确认信息,选择爱吃的菜品,点击确认,完成结账. 整个过程可以 ...
- 基于单片机的水壶自动加热系统_基于烟雾检测火灾自动报警系统
著作权归作者所有. 商业转载请联系作者获得授权,非商业转载清注明出处. 作者:胡皓 王兴 链接:基于烟雾检测火灾自动报警系统 - 中国知网 来源:中国知网 摘要:讨论了用MC14468离子型烟雾检测报 ...
- 3检测人头_基于人头检测技术客流统计摄像头及管理平台
神目智慧客流统计系统采用先进的人头检测算法,基于1080P分辨率的视频流,检测画面中人头位置,结合智能跟踪算法分析行人的运动轨迹,精确地计算出客流人数及行走方向,并将数据实时上传云端,多维度数据查看. ...
- lstm中look_back的大小选择_基于机器学习检测僵尸网络中的域名生成算法
0x01 Absert 恶意软件通常使用域名生成算法(DGA)作为联系其C&C服务器的机制.近年来,基于机器学习已经提出了不同的方法来自动检测生成的域名.但也存在一些问题.第一个问题是,由于缺 ...
- linux 系统arp检测工具,基于LinuxARP检测与防御系统.doc
基于LinuxARP检测与防御系统 基于LinuxARP检测与防御系统 摘 要:ARP协议,即地址解析协议,由于协议存在的漏洞导致ARP欺骗几乎无法避免.为探讨如何解决这一问题,通过理论研究和实证,论 ...
- keepalived+lvs基于http检测
keepalived+lvs基于http检测 keepalived+lvs基于tcp检测无法探测到后端的Java程序是否假死,所以此时就需要用到基于http的检测方法. 基于http检测的原理是检测后 ...
- 【毕业设计/图像识别系列】基于凸包检测和重心距离法的指尖检测和识别【含Python源码】
Date: 2022.5.23 文章目录 前言 0.代码获取方式 1.参考 2.算法原理 3.实现效果图 4.Python程序(核心) 前言 在大学毕业设计的时候,课题要求实现<基于凸包检测和重 ...
- 基于目标检测的海上舰船图像超分辨率研究
基于目标检测的海上舰船图像超分辨率研究 人工智能技术与咨询 来源:< 图像与信号处理> ,作者张坤等 关键词: 目标检测:生成对抗网络:超分辨率 摘要: 针对海上舰船图像有效像素在整体像素 ...
最新文章
- 【DIY】热水器升级加装远程wifi控制功能,esp8266远程红外控制热水器启动,稳定连续运行4天了,功能展示终稿...
- python图形用户界面pyside_PySide——Python图形化界面入门教程(一)
- 例题4-5 引发的static知识点
- 天池 在线编程 Character deletion
- linux django搭建网站,Linux下搭建Django站点一
- 动态规划( python)
- 第八届开源操作系统年度技术会议(OS2ATC)在京召开, 百位科技菁英到场共鉴“开源协作”
- 最简单的BERT模型调用方法
- IDEA回到光标的上一次位置
- 六度空间-c++实现
- python多张子图画在一张画布上,显示图例和标题,并保存。
- windows下DxDiag查看笔记本电脑主板型号信息
- linux sed -i 命令
- 图像算法---白平衡AWB
- java获取指定时间为第几周_Java8根据一年中的第几周获得Monday
- php 微信 语音,微信语音的上传与下载功能实现详解
- 【转载】DayDayUp:2020,再见了,不平凡的一年,让我懂得了珍惜,让我明白了越努力越幸运
- 《程序员修炼之道》读书笔记(二)--第三周
- ModuleNotFoundError: No module named ‘pyLDAvis.gensim‘解决方案
- python自动抢_Python+Appium实现自动抢微信红包