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;//电源电压*1000
void 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的内存空间比较小,还是希望能寄存器开发,这等待有空再参考库函数研究测量内部参考电压的寄存器操作吧。
上一篇:STM8L051F3基础功能:内部时钟;TIM2定时器;串口及printf
下一篇:STM8L051F3_02_EXTI应用
推荐阅读最新更新时间:2024-11-01 15:37
设计资源 培训 开发板 精华推荐
- DM240001-3,用于 16 位 PIC24 MCU、dsPIC DSC 和 32 位 PIC32 MCU 的 Explorer 16/32 开发套件
- 用于可调电流源的 LT1764AET-3.3 LDO 稳压器的典型应用
- 使用 Microchip Technology 的 MIC74B 的参考设计
- EVAL-AD1955EBZ,评估板使用 AD1955 高性能、多位 Sigma-Delta DAC 和 SACD 播放
- CN3791 验证板 单节锂电4A充电模块 支持MPPT
- 使用 Analog Devices 的 LT1317BCMS8 的参考设计
- PCB元素周期表
- 基于LNBH26LS的LNB电源评估板
- 数字小键盘 带HUB
- DC1710A-D,使用 LTC5593 的演示板,2.3 至 4.5GHz,IF=190MHz,+/-30MHz 带宽,双通道高动态范围下变频混频器