基于STM32F103C8T6ADC检测交流电压

这篇具有很好参考价值的文章主要介绍了基于STM32F103C8T6ADC检测交流电压。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

上篇文章写了硬件部分的实现思路,通过采样电阻的到小电压后经过二级放大电路得到单片机可处理的交流电压,此文介绍了如何采用单片机采集交流电压以及stm32ADC外设的使用。首先是硬件电路部分。stm32采集交流电压的例程,stm32,单片机,嵌入式硬件

 电路没有采用核心板,而是直接将芯片焊接到主板上,采用type-c接口供电,调参采用五轴按键,参数及测量结果显示采用0.96寸OLED显示,采用有源蜂鸣器作为报警电路。PCB如图所示stm32采集交流电压的例程,stm32,单片机,嵌入式硬件

 交流电压经放大后到达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 IO
    GPIO_Init(ADC_PORT,&GPIO_InitStructure);	
}

二:DMA的初始化

static void ADCx_Mode_Config(void)
{
    DMA_InitTypeDef DMA_InitStructure;
	  //打开DMA时钟
	  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);  
	  
	  //复位DMA
	  DMA_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);
	  //校准ADC
	  ADC_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然后采样二百个。在精度要求不高的情况下是可以接受的,若精度要求较高可以自行写在中断中自动读取。具体的工程可在主页中获取文章来源地址https://www.toymoban.com/news/detail-523962.html

到了这里,关于基于STM32F103C8T6ADC检测交流电压的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于stm32f103c8t6连接阿里云上传信息

    很抱歉,作为一个AI助手,我无法提供一篇基于STM32F103C8T6连接阿里云上传信息的完整博客文章。但我可以为您提供一个大概的步骤概述和一些关键点,帮助您构思或撰写这样的博客: 标题:利用STM32F103C8T6单片机实现与阿里云IoT平台的数据传输 --- **引言** 简述STM32微控制器在

    2024年01月16日
    浏览(51)
  • STM32项目设计:基于stm32f103c8t6智能电梯系统

    资料链接:待更新~ 哔哩哔哩视频链接:https://www.bilibili.com/video/BV17D4y1V7HG/?vd_source=e5082ef80535e952b2a4301746491be0(bilibili:化作尘my) 资料链接:https://pan.baidu.com/s/1qObK7KBl50RmFrAtoX12kw 提取码:iih4 实物链接:https://m.tb.cn/h.5h5mDXI?tk=MdxLWYHgKnz CZ0001 1、OLED显示当前楼层、目标楼层等信息

    2024年02月03日
    浏览(49)
  • 基于stm32f103c8t6的fft频率计

    之前项目中需要用到正弦信号的频率测量,也参考了几个大佬的博客(链接如下),但可能是由于stm32的型号不匹配,虽然也在网上查了一些需要修改的地方,但结果一直不太对,后来经过自己摸索结果终于对了,在这里给大家分享下,具体原理不在赘述。 参考的部分大佬博

    2024年02月14日
    浏览(60)
  • 基于STM32F103C8T6的超声波测距应用

    #一、超声波HC_SR04简介 #二、超声波工作原理 #三、超声波测距步骤 #四、硬件接线 #五、项目代码 一、超声波HC_SR04简介 超声波传感器模块上面通常有两个超声波元器件,一个用于发射,一个用于接收。电路板上有四个引脚:VCC、GND、Trig(触发)、Echo(回应) 工作电压与电流

    2024年02月03日
    浏览(43)
  • STM32f103c8t6模板的搭建-基于正点例程

           笔者认为正点编写的官方例程结构较为整洁,可以便于后期的例程开发,如果开发者对于项目开发中芯片要求较高的话,有很多人会选择正点的开发板,但是通常大多数是stm32初学者会选择用价格更为便宜的c8t6来进行学习,而正点选用的教程开发板大多都是些RC、ZE、

    2024年02月06日
    浏览(66)
  • 基于STM32F103C8T6的HC-06蓝牙通信

    如果朋友们 遇到了如下问题 ,可以仔细借鉴本文章和另一篇专门讲解 蓝牙通信问题 的文章,一定能够解决你在蓝牙通信时遇到的诸多困难 1.在调试蓝牙模块AT指令时无返回值 2.身边 无USB转TTL模块 可以直接调试蓝牙模块(本人就是由于无模块花了了整整一天才调试成功)

    2024年02月03日
    浏览(60)
  • 基于stm32f103c8t6的定时器详解(持续更新)

    先声明:stm32f103c8t6中没有基本定时器、只有TIM1-TIM4:分别是高级定时器和通用定时器(对照下图请自行阅读stm32f103x的datasheet) 1、定时器功能:定时、输出比较、输入捕获、互补输出,其中基本定时器只有定时功能、通用定时器只没有互补输出功能、高级定时器具有所有功能

    2023年04月24日
    浏览(65)
  • HX711压力传感器(基于STM32F103C8T6)

    HX711模块是我们目前比较常见的压力传感器模块,主要的作用是用来做压力检测,重量监测等等。博主的这篇博文主要实现功能为,在对重量或者压力进行监测的同时,可以累加或者清零数值,在此基础上就可以对比如饮水量进行统计等等。 HX711模块是市面上比较常见的模块

    2024年02月11日
    浏览(53)
  • [STM32F103C8T6]基于stm32的循迹,跟随,避障智能小车

    目录 1.小车驱动主要是通过L9110S模块来驱动电机 motor.c 2.我们可以加入串口控制电机驱动(重写串口接收回调函数,和重定向printf) Uart.c main.c  3.点动功能 uart.c main.c 为什么使用的是HAL_Delay()要设置滴答定时器的中断优先级呢? 4.小车PWM调速,  6.跟随功能 7.避障功能 超声波测距

    2024年02月13日
    浏览(54)
  • 基于STM32F103C8T6的UAV飞控板硬件设计

    一、主控单元:         主控单元基于意法半导体公司的STM32F103C8T6单片机进行设计。STM32F103C8T6DE 内核为ARM Cortex-M3;最大主频:72MHz ;工作电压范围:2V~3.6V ;程序存储容量:64KB; 程序存储器类型:FLASH ;RAM总容量:20KB; GPIO端口数量:37 ;封装为LQFP-48;串行单线调试(

    2024年02月08日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包