請(qǐng)問(wèn)有ch582上移植DS18B20的案例嗎?
可以參考本博客進(jìn)行驅(qū)動(dòng),內(nèi)附代碼582驅(qū)動(dòng)DS18B20 - JayWell - 博客園 (cnblogs.com)
請(qǐng)問(wèn)還有ch582上移植MQ-7的案例嗎?
暫時(shí)沒(méi)有這個(gè)例程,可以根據(jù)模塊特性和手冊(cè)對(duì)這個(gè)模塊進(jìn)行操作,可以通過(guò)ADC讀取傳感器輸出的模擬電壓信號(hào),再根據(jù)傳感器的特性曲線(xiàn)函數(shù)將電壓值轉(zhuǎn)換為一氧化碳濃度值。
我找了一篇MQ_7的文章跟著做發(fā)現(xiàn),沒(méi)法移植上去呢。文章鏈接:https://blog.csdn.net/m0_64562382/article/details/139247866
第二篇文章鏈接:https://blog.csdn.net/xhj1021/article/details/124016779
這樣代碼有問(wèn)題嗎?
#include "CH58x_adc.h"
#define CAL_PPM? 10? ?// 校準(zhǔn)環(huán)境中PPM值
#define RL? ? ? ?10? ?// RL阻值 (負(fù)載電阻)
static float R0;? ? ?// 元件在潔凈空氣中的阻值
// 傳感器初始化
void ADC_Init() {
? ? // 使能ADC電源
? ? R8_ADC_CFG |= RB_ADC_POWER_ON;
? ? // 設(shè)置采樣通道為 A8
? ? ADC_ChannelCfg(CH_EXTIN_12);
? ? // 設(shè)置采樣時(shí)鐘為 4M,適中的速度和分辨率
? ? ADC_SampClkCfg(SampleFreq_4);
? ? // 設(shè)置信號(hào)增益為 1 倍,如果信號(hào)太小可以嘗試增大
? ? ADC_PGACfg(ADC_PGA_0);
? ? // 開(kāi)始 ADC
? ? ADC_StartUp();
}
uint16_t ADC_GetResult(void) {
? ? // 讀取ADC轉(zhuǎn)換結(jié)果
? ? return ADC_ReadConverValue();
}
float Read_ADC_Voltage() {
? ? // 獲取ADC結(jié)果并轉(zhuǎn)換為電壓
? ? uint16_t adcValue = ADC_GetResult();
? ? return (adcValue * 3.3f) / 4095.0f;? // 轉(zhuǎn)換為電壓值
}
// 傳感器校準(zhǔn)函數(shù),根據(jù)當(dāng)前環(huán)境PPM值與測(cè)得的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();? // 執(zhí)行校準(zhǔn)
}
/*
?* MQ-7相關(guān)
?*/
? ? ? ? MQ7_Init();
? ? ? ? float ppm_ans=MQ7_GetPPM();
首先先確保獲取的電壓值是正確的,
注意不同增益的計(jì)算公式:
默認(rèn)是0增益,確實(shí)是只能采集到最高2.1V的電壓。ADC采集值用下發(fā)公式換算出實(shí)際電壓。vref 1.05V
計(jì)算公式中先乘以1050,數(shù)據(jù)類(lèi)型為16位無(wú)符號(hào)。
adcBuff[i]*1050/512-3*1050,-12db增益。
adcBuff[i]*1050/1024-1050,-6db增益。
adcBuff[i]*1050/2048,0db增益。
上述貼出的程序中使用的也是0dB,注意計(jì)算公式的選用“? return (adcValue * 3.3f) / 4095.0f;? // 轉(zhuǎn)換為電壓值”使用上面0db的計(jì)算公式((adcValue?*1050)/2048)。
使用單通道采樣時(shí)加上偏差值RoughCalib_Value = ADC_DataCalib_Rough();可以多次采樣取平均。
可以先用例程采集電壓與萬(wàn)用表量出的電壓對(duì)照是否正確,再進(jìn)行濃度的換算。