获取 ADC 输入时出错

Error getting ADC input

本文关键字:出错 输入 ADC 获取      更新时间:2023-10-16

我正在使用基于Cortex-M3的板。这是我第一次对这种板进行编程,所以我不知道如何阅读库并使其"发生"。

该板带有温度传感器,我正在尝试使用 adc 库进行读取。

我的代码:

#include <adc.h>
#include <gpio.h>
using namespace EPOS;
//const NIC::Protocol NIC_PROTOCOL = 42;
ADC * temperature;
int main()
{
temperature = new ADC( 0xE, 0x2, 0x3);
//    printf("&temperature"); 
return 0;
}

图书馆

// EPOS ARM Cortex-M Analog to Digital Converter (ADC) Mediator Declarations
#include <system/config.h>
#if !defined(__cortex_adc_h_) && defined(__ADC_H)
#define __cortex_adc_h_
#include <adc.h>
#include <machine.h>
__BEGIN_SYS
class ADC: private ADC_Common, private Machine_Model
{
public:
enum Channel {
SINGLE_ENDED_ADC0 = 0,
SINGLE_ENDED_ADC1 = 1,
SINGLE_ENDED_ADC2 = 2,
SINGLE_ENDED_ADC3 = 3,
SINGLE_ENDED_ADC4 = 4,
SINGLE_ENDED_ADC5 = 5,
SINGLE_ENDED_ADC6 = 6,
SINGLE_ENDED_ADC7 = 7,
DIFF8             = 8,
DIFF9             = 9,
DIFF10            = 10,
DIFF11            = 11,
GND               = 12,
TEMPERATURE       = 14,
AVDD5_3           = 15,
};
enum Reference {
INTERNAL_REF   = 0,
EXTERNAL_REF   = 1, // External reference on AIN7 pin
SYSTEM_REF     = 2,
EXTERNAL_DIFF  = 3
};
enum Resolution {
BITS_7  = 0, //  7 bits resolution, 64  decimation rate
BITS_9  = 1, //  9 bits resolution, 128 decimation rate
BITS_10 = 2, // 10 bits resolution, 256 decimation rate
BITS_12 = 3  // 12 bits resolution, 512 decimation rate
};
ADC(const Channel & channel = SINGLE_ENDED_ADC5, const Reference & reference = SYSTEM_REF, const Resolution & resolution = BITS_12)
: _channel(channel), _reference(reference), _resolution(resolution) {
Machine_Model::adc_config(_channel);
}
short read() {
reg(ADCCON3) = (_reference * ADCCON3_EREF) | (_resolution * ADCCON3_EDIV) | (_channel * ADCCON3_ECH);
while(!(reg(ADCCON1) & ADCCON1_EOC));
short ret = (reg(ADCH) << 8) + reg(ADCL);
switch(_resolution) {
case BITS_7:  ret >>= 9; break;
case BITS_9:  ret >>= 7; break;
case BITS_10: ret >>= 6; break;
case BITS_12: ret >>= 4; break;
}
return ret;
}
// returns the voltage corresponding to the reading, with three decimal places (e.g. 2534 means 2.534V)
int convert(short raw_reading, int reference = 3300/*3.3V*/) {
int limit;
switch(_resolution) {
case BITS_7:  limit =   63; break;
case BITS_9:  limit =  255; break;
case BITS_10: limit =  511; break;
case BITS_12: limit = 2047; break;
}
return raw_reading * reference / limit;
}
private:
volatile CPU::Reg32 & reg(unsigned int o) { return reinterpret_cast<volatile CPU::Reg32*>(ADC_BASE)[o / sizeof(CPU::Reg32)]; }
Channel _channel;
Reference _reference;
Resolution _resolution;
};
__END_SYS
#endif

错误:

temperature.cc:在函数 'int main()' 中: temperature.cc:11: 错误: 从"int"到"EPOS::S::ADC::通道"的转换无效 temperature.cc:11:错误:初始化参数 1 'EPOS::S::ADC::ADC(const EPOS::S::ADC::Channel&, const EPOS::S::ADC::Reference&, const EPOS::S::ADC::Resolution&)' temperature.cc:11:错误:从"int"到 "EPOS::S::ADC::引用" temperature.cc:11:错误:正在初始化 'EPOS::S::ADC::ADC(const EPOS::S::ADC::Channel&, const 的参数 2 EPOS::S::ADC::Reference&, const EPOS::S::ADC::Resolution&)' temperature.cc:11:错误:从"int"到 "EPOS::S::ADC::分辨率" temperature.cc:11:错误:正在初始化 'EPOS::S::ADC::ADC(const EPOS::S::ADC::Channel&, const EPOS::S::ADC::Reference&, const EPOS::S::ADC::Resolution&)' 制作文件:11: 目标"温度.O"的配方失败 制作[2]:* [temperature.o] 错误 1 make[2]:离开目录 '/home/thiago/Documents/arm/app' makefile:17: 目标 'app' 的配方 失败的制作[1]: *[应用程序] 错误 2 制作[1]: 离开目录 '/home/thiago/Documents/arm' makefile:11: 目标"全部"的配方 失败的制作: *** [全部] 错误 2

编程语言:c++

谢谢。

ADC 构造函数希望通过引用传递 3 个参数,因此必须传递变量。

您的代码至少应:

int main(void)
{  
Channel channel = TEMPERATURE; 
Reference reference = SYSTEM_REF;
Resolution resolution = BITS_12;
temperature = new ADC( channel, reference, resolution);
return 0;
}

编辑

正如其他用户已经说过的,您应该避免在具有有限资源(主要是RAM)的uC的嵌入式应用程序上使用动态分配。

因此,您可以像以下方式实例化您的类:

int main(void)
{  
short temperature;
Channel channel = TEMPERATURE; 
Reference reference = SYSTEM_REF;
Resolution resolution = BITS_12;
ADC reader( channel, reference, resolution);
while (1)
{
temperature = reader.read();
}
}