LoRa终端设备ASR6505之ADC采样
时间:2022-07-25
本文章向大家介绍LoRa终端设备ASR6505之ADC采样,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
前言:对低功耗设备来说,采集上报电池电压非常重要,通过电池电压可以辅助判断设备的使用寿命。ASR6505提供了丰富的外设接口,本篇文章主要聊一聊ADC接口的使用。
1、ADC通道说明
只有1个ADC外设,预留了3个通道供使用,开发板中H3针脚正是引出的ADC通道。
与STM8L的对应关系如下:
ASR6505 STM8L
IN0 PC2(ADC1_IN6)
IN1 PC3(ADC1_IN5)
IN2 PC7(ADC1_IN3)
2、ADC参考电压
VREFP引脚:是ADC参考电压的输入引脚,即就是开发板上的P4跳线帽,插上P4跳线帽就表示用VCC当做参考电压。
芯片内部参考电压:
可以看出,典型值为1.224V,因此我们采样的时候就以这个为参考来校准其他通道的采样值。
3、实验设计
间隔5s读取ASR6505的ADC的内部参考电压通道以及通道0的值,并转化成电压值通过串口打印。分别把VCC和GND输入到通道0。
4、代码实现
periph_adc.h/c部分代码:
#define ASR6505_CH_IN0 ADC_Channel_6
#define ASR6505_CH_IN1 ADC_Channel_5
#define ASR6505_CH_IN2 ADC_Channel_3
#define ASR6505_PIN_IN0 PC_2
#define ASR6505_PIN_IN1 PC_3
#define ASR6505_PIN_IN2 PC
Gpio_t AdcIn0;
void ADC_PeriphInit(void)
{
GpioInit( &AdcIn0, ASR6505_PIN_IN0, PIN_INPUT, PIN_PUSH_PULL, PIN_NO_PULL, 0);
//初始化通道对应的io口
}
void ADC_ReadSensor(void)
{
uint16_t adc_ref = 0,adc_data=0;
float value=0;
CLK_PeripheralClockConfig(CLK_Peripheral_ADC1, ENABLE);//使能时钟
//初始化ADC
ADC_Init(ADC1, ADC_ConversionMode_Continuous, ADC_Resolution_12Bit, ADC_Prescaler_1);
ADC_Cmd(ADC1, ENABLE);
//ADC通道设置
ADC_SamplingTimeConfig(ADC1, ADC_Group_FastChannels, ADC_SamplingTime_192Cycles);
ADC_SamplingTimeConfig(ADC1, ADC_Group_SlowChannels, ADC_SamplingTime_192Cycles);
ADC_VrefintCmd(ENABLE); //使能内部参考电压
ADC_ChannelCmd(ADC1, ADC_Channel_Vrefint, ENABLE);//使能通道
ADC_SoftwareStartConv(ADC1); //开始转化
while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));//等待转化完成
ADC_ClearFlag(ADC1 , ADC_FLAG_EOC); //清除标志位
adc_ref = ADC_GetConversionValue(ADC1);//读取转化结果
ADC_ChannelCmd(ADC1, ADC_Channel_Vrefint, DISABLE);//失能通道
ADC_ChannelCmd(ADC1, ASR6505_CH_IN0, ENABLE);
ADC_SoftwareStartConv(ADC1);
while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));
ADC_ClearFlag(ADC1 , ADC_FLAG_EOC);
adc_data = ADC_GetConversionValue(ADC1);
ADC_DeInit(ADC1);
CLK_PeripheralClockConfig(CLK_Peripheral_ADC1, DISABLE);
value=(1.224*4096.0/adc_ref)*(adc_data/4096.0);
printf("adc_ref=%d,adc_data=%d,value=%frn",adc_ref,adc_data,value);
}
主函数部分代码:
int main( void )
{
BoardInitMcu( );
BoardInitPeriph( );
printf("ASR6505 ADC test!rn");
ADC_PeriphInit();
while(1)
{
ADC_ReadSensor();
printf("-------------------------------------------------- rnrn");
Delay(5);
}
}
5、实验现象
《从0到1搭建LoRa物联网》系列文章推荐:
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android progressbar实现带底部指示器和文字的进度条
- js 调用栈机制与ES6尾调用优化介绍
- Android Fragment实现列表和内容联动
- 前端中等算法-无重复字符的最长子串
- Android自定义动态壁纸开发(时钟)
- 手摸手教你写个ESLint 插件以及了解ESLint的运行原理
- 填满Github的绿色格子用我做的VSCode插件-Auto Commit
- Android多国语言转换Excel及Excel转换为string详解
- python上传时包含boundary时的解决方法
- 4行Python代码生成图像验证码(2种)
- Python 输出详细的异常信息(traceback)方式
- 我开发了一个一键添加佛祖保佑永无BUG、神兽护体等注释图形的工具
- Django实现whoosh搜索引擎使用jieba分词
- VMware下ubuntu与Windows实现文件共享的方法
- android自定义view实现数字进度条