【EFM32 Zero Gecko Starter Kit】-4-ADC采集温度信息
[复制链接]
本帖来记录一下ADC模块的使用。目的是读取一个模拟温度传感器,这个传感器的接口直接通过ADC读取接口。
温度传感器型号是Adafruit TMP235:
温度计算范围:
Temp °C = 100*(reading in V) - 50
计划选用PD6,目前暂未被使用。
从数据手册来看:
、
还在在Simplicity Studio里面,找到SoftwareComponent的ADC组件,点击Install。
在main里面编写核心代码:
#define adcFreq 13000000
volatile uint32_t sample;
volatile uint32_t millivolts;
volatile char Temperature[20];
/**************************************************************************//**
* @brief Initialize ADC function
*****************************************************************************/
void initADC (void)
{
// Enable ADC0 clock
CMU_ClockEnable(cmuClock_ADC0, true);
// Declare init structs
ADC_Init_TypeDef init = ADC_INIT_DEFAULT;
ADC_InitSingle_TypeDef initSingle = ADC_INITSINGLE_DEFAULT;
// Modify init structs and initialize
init.prescale = ADC_PrescaleCalc(adcFreq, 0); // Init to max ADC clock for Series 0
init.timebase = ADC_TimebaseCalc(0);
initSingle.diff = false; // single ended
initSingle.reference = adcRef2V5; // internal 2.5V reference
initSingle.resolution = adcRes12Bit; // 12-bit resolution
// Select ADC input. See README for corresponding EXP header pin.
initSingle.input = adcSingleInputCh6;
ADC_Init(ADC0, &init);
ADC_InitSingle(ADC0, &initSingle);
// Enable ADC Single Conversion Complete interrupt
ADC_IntEnable(ADC0, ADC_IEN_SINGLE);
// Enable ADC interrupts
NVIC_ClearPendingIRQ(ADC0_IRQn);
NVIC_EnableIRQ(ADC0_IRQn);
}
/**************************************************************************//**
* @brief ADC Handler
*****************************************************************************/
void ADC0_IRQHandler(void)
{
// Clear the interrupt flag
ADC_IntClear(ADC0, ADC_IFC_SINGLE);
// Get ADC result
sample = ADC_DataSingleGet(ADC0);
// Calculate input voltage in mV
millivolts = (sample * 2500) / 4096;
// Start next ADC conversion
ADC_Start(ADC0, adcStartSingle);
}
/**************************************************************************//**
* @brief Main function
*****************************************************************************/
int main(void)
{
CHIP_Init();
initADC();
// Start first conversion
ADC_Start(ADC0, adcStartSingle);
sprintf(Temperature, "%10.3f", (100*Temperature - 50));
GLIB_drawStringOnLine(&glibContext,
Temperature,
currentLine++,
GLIB_ALIGN_LEFT,
5,
5,
true);
DMD_updateDisplay();
// Infinite loop
while(1);
}
需要注意的是采用通道是CH6,因为选择的是PD6.
至此程序编写已经完成,还有一个需要注意的地方:
测试结果:
待完善。
|