请问有ch582上移植DS18B20的案例吗?
可以参考本博客进行驱动,内附代码582驱动DS18B20 - JayWell - 博客园 (cnblogs.com)
请问还有ch582上移植MQ-7的案例吗?
暂时没有这个例程,可以根据模块特性和手册对这个模块进行操作,可以通过ADC读取传感器输出的模拟电压信号,再根据传感器的特性曲线函数将电压值转换为一氧化碳浓度值。
我找了一篇MQ_7的文章跟着做发现,没法移植上去呢。文章链接:https://blog.csdn.net/m0_64562382/article/details/139247866
第二篇文章链接:https://blog.csdn.net/xhj1021/article/details/124016779
这样代码有问题吗?
#include "CH58x_adc.h"
#define CAL_PPM 10 // 校准环境中PPM值
#define RL 10 // RL阻值 (负载电阻)
static float R0; // 元件在洁净空气中的阻值
// 传感器初始化
void ADC_Init() {
// 使能ADC电源
R8_ADC_CFG |= RB_ADC_POWER_ON;
// 设置采样通道为 A8
ADC_ChannelCfg(CH_EXTIN_12);
// 设置采样时钟为 4M,适中的速度和分辨率
ADC_SampClkCfg(SampleFreq_4);
// 设置信号增益为 1 倍,如果信号太小可以尝试增大
ADC_PGACfg(ADC_PGA_0);
// 开始 ADC
ADC_StartUp();
}
uint16_t ADC_GetResult(void) {
// 读取ADC转换结果
return ADC_ReadConverValue();
}
float Read_ADC_Voltage() {
// 获取ADC结果并转换为电压
uint16_t adcValue = ADC_GetResult();
return (adcValue * 3.3f) / 4095.0f; // 转换为电压值
}
// 传感器校准函数,根据当前环境PPM值与测得的RS电压值,反推出R0值
void MQ7_PPM_Calibration() {
float Vrl = Read_ADC_Voltage();
float RS = (3.3f - Vrl) / Vrl * RL;
R0 = RS / pow(CAL_PPM / 98.322, 1 / -1.458f);
}
// 获取传感器的PPM值
float MQ7_GetPPM(void) {
float Vrl = Read_ADC_Voltage();
float RS = (3.3f - Vrl) / Vrl * RL;
float ppm = 98.322f * pow(RS / R0, -1.458f);
return ppm;
}
void MQ7_Init(void) {
ADC_Init(); // 初始化ADC
MQ7_PPM_Calibration(); // 执行校准
}
/*
* MQ-7相关
*/
MQ7_Init();
float ppm_ans=MQ7_GetPPM();
首先先确保获取的电压值是正确的,
注意不同增益的计算公式:
默认是0增益,确实是只能采集到最高2.1V的电压。ADC采集值用下发公式换算出实际电压。vref 1.05V
计算公式中先乘以1050,数据类型为16位无符号。
adcBuff[i]*1050/512-3*1050,-12db增益。
adcBuff[i]*1050/1024-1050,-6db增益。
adcBuff[i]*1050/2048,0db增益。
上述贴出的程序中使用的也是0dB,注意计算公式的选用“? return (adcValue * 3.3f) / 4095.0f;? // 转换为电压值”使用上面0db的计算公式((adcValue?*1050)/2048)。
使用单通道采样时加上偏差值RoughCalib_Value = ADC_DataCalib_Rough();可以多次采样取平均。
可以先用例程采集电压与万用表量出的电压对照是否正确,再进行浓度的换算。