STM8L051之通过ADC1与DMA读取内部参考电压,求取VDD电源电压---库函数版
来源:互联网 发布:四级网络课程哪个好 编辑:程序博客网 时间:2024/05/21 03:20
stm8L051芯片内部的参考电压与电源电压有一定的关系,
这在芯片供电电压变化的情况下,测量外部ADC电压输入
提供一个确定的参考电压。这里提前厘清下:该内部参考
电压VREFINT 并非ADC 的参考电压,ADC 的参考电压依
然是VDD。即使VDD 有所波动,这个VREFINT 电压恒定
不变,对于ADC 电路而言,它只是个测试点。
对于某固定的ADC 参考电压情况下,所有被测电压点的
AD转换值与该点电压值保持同一比例关系,换句话说,
对于ADC参考电压固定情况下,各点的电压与ADC值与成
线性关系。下面图形是芯片分别在3个不同参考电压的示意
图,这里参考电压接VDD。下面三根斜线分别是VDD 为2.8V
、3.2V、3.6V 时的AD转换曲线示意图。那根黄色垂直虚线是
表示内部VREFINT电压(1.22V)所在的位置。
(图片以及部分文字是引用网友的原话,如果需要我备注的请给我提醒一下)
刚开始的时候我是直接操作寄存器,但无奈怎样读测
不准,计算值同实际电源电压差别比较大,后来不得
已才用库函数试试。效果还可以,能测量电源的电压,
当然stm8L芯片内部已经有一个出厂时写好的校准值,
程序中可以读取,这里我只用手册中(技术手册中比编
程手册说的详细一点),的典型值1.224V。下面是相
关的代码(参考固件库的adc与dma例程):
#include "adc.h"#include "led.h"uint16_t Buffer[BUFFER_SIZE] = {0};uint32_t Verfin = 0;//电源电压*1000void ADC_Config(void){ /* Enable ADC1 clock */ CLK_PeripheralClockConfig(CLK_Peripheral_ADC1, ENABLE);/* Initialize and configure ADC1 */ ADC_Init(ADC1, ADC_ConversionMode_Single, ADC_Resolution_12Bit, ADC_Prescaler_1); ADC_SamplingTimeConfig(ADC1, ADC_Group_SlowChannels, ADC_SamplingTime_24Cycles); ADC_SamplingTimeConfig(ADC1, ADC_Group_FastChannels, ADC_SamplingTime_24Cycles); /* Enable ADC1 */ ADC_Cmd(ADC1, ENABLE); ADC_VrefintCmd(ENABLE); /* Enable ADC1 Channels 3 */ ADC_ChannelCmd(ADC1, ADC_Channel_3, ENABLE); /* connected to Potentiometer RV */ /* Enable ADC1 Channels 24 */ ADC_ChannelCmd(ADC1, ADC_Channel_Vrefint, ENABLE); /* connected to ADC_Channel_Vrefint */}void DMA_Config(void){ /* Enable DMA1 clock */ CLK_PeripheralClockConfig(CLK_Peripheral_DMA1, ENABLE); /* Connect ADC to DMA channel 0 */ SYSCFG_REMAPDMAChannelConfig(REMAP_DMA1Channel_ADC1ToChannel0);//ADC通道要remap//BUFFER_SIZE DMA_Init(DMA1_Channel0, BUFFER_ADDRESS, ADC1_DR_ADDRESS, BUFFER_SIZE, DMA_DIR_PeripheralToMemory, DMA_Mode_Circular, DMA_MemoryIncMode_Inc, DMA_Priority_High, DMA_MemoryDataSize_HalfWord); /* DMA Channel0 enable */ DMA_Cmd(DMA1_Channel0, ENABLE); /* Enable DMA1 channel0 Transfer complete interrupt */ DMA_ITConfig(DMA1_Channel0, DMA_ITx_TC, ENABLE); /* DMA enable */ DMA_GlobalCmd(ENABLE); ADC_DMACmd(ADC1, ENABLE); }/** * @brief DMA1 channel0 and channel1 Interrupt routine. * @param None * @retval None */INTERRUPT_HANDLER(DMA1_CHANNEL0_1_IRQHandler, 2){ /* In order to detect unexpected events during development, it is recommended to set a breakpoint on the following instruction. */ /* Calculate Potentiometer RV voltage value*/ // Voltage = (uint32_t)((uint32_t)Buffer[0] * //(uint32_t)ADC_RATIO) / 1000; /* Calculate BNC voltage value*/ //(uint32_t)((uint32_t)Buffer[1] * 1225) / 1000; Verfin = (uint32_t)1224*4096/Buffer[1]; //GPIO_ToggleBits(GPIOB, GPIO_Pin_4); /* Clear IT Pending Bit */ DMA_ClearITPendingBit(DMA1_IT_TC0);}
上面时,c中的代码,。h中的如下:
ifndef __ADC_H#define __ADC_H#include "stm8l15x.h"//#include "stm8l15x_it.h"/* Private typedef -----------------------------------------------------------*//* Private define ------------------------------------------------------------*/#define ADC1_DR_ADDRESS ((uint16_t)0x5344)#define BUFFER_SIZE ((uint8_t) 0x02)#define BUFFER_ADDRESS ((uint16_t)(&Buffer))extern uint16_t Buffer[BUFFER_SIZE];/* Private macro -------------------------------------------------------------*//* Private variables ---------------------------------------------------------*/void ADC_Config(void);void DMA_Config(void);#endif
下面是main中的代码:
#include "bsp.h"int main( void ){ SysInit();//bsp文件中包含了系统,adc与dma的初始化/* Enable Interrupts */ enableInterrupts(); ADC_SoftwareStartConv(ADC1);//START,necessary 启动adc转换 while(1) { } return 0;}
从调试窗口中看到,Verfin = 2498,实际万用表测
的电压=2.49V,可见测量的数据还是挺准确的,另
外在3点多V电源情况测的值也基本准确。
最后,由于stm8L051的内存空间比较小,
还是希望能寄存器开发,这等待有空再参
考库函数研究测量内部参考电压的寄存器操作吧。
- STM8L051之通过ADC1与DMA读取内部参考电压,求取VDD电源电压---库函数版
- STM8L使用ADC内部参考电压通道测量VDD电压
- 利用ST MCU内部基准参考电压监测电源电压及其它
- 基准电源和参考电压
- MEMORY主电源电压变化数据(VDD=VDDQ)
- 智能卡的电源电压
- 电源电压输出问题
- 电压
- STM32芯片ADC内部的CH17参考电压的用途
- 参考电压vref
- stm32 AD参考电压
- VCC、 VDD、VEE、VSS 电压理解
- VCC、 VDD、VEE、VSS 电压理解
- upD79F8513A(NEC)或upD78F0511A(NEC)之电源电压检测
- 电源管理-电压状态划分
- STM32F4之ADC1【库函数操作】
- 什么是ADC的参考电压,为什么需要参考电压?
- MSP430F5529 ComB参考电压选择
- 【DRP分销资源计划】——oracle无法正常工作的解决办法
- Gradle中SDK版本及versoin版本的含义
- Redis整合Spring综合使用缓存实例
- ubuntu 定时脚本折腾札记
- Java字节码文件虚拟指令集简介
- STM8L051之通过ADC1与DMA读取内部参考电压,求取VDD电源电压---库函数版
- 美团Android自动化之旅—适配渠道包
- 一种解决运行程序报“应用程序配置不正确”的问题
- java.lang.NoClassDefFoundError: org.springframework.beans.FatalBeanException
- git常用命令
- 机器学习笔记(PRML)
- 查找一个字符串数组中两个或两个以上的相同字符串(swfit,oc)
- MYSQL数据库设计规范与原则
- Intellij IDEA 快捷键(windows)