写CC2640的ADC很多,现在提供一个自己写的ADC子程序,多人验证过都可以使用。
子程序如下:
#include "AppAdc.h"
#include <inc/hw_types.h>
#include <ti/sysbios/family/arm/m3/Hwi.h>
#include <inc/hw_memmap.h>
#include <driverlib/aux_wuc.h>
#include <driverlib/aux_adc.h>
#include <inc/hw_aux_evctl.h>
#include <inc/hw_adi.h>
#include <inc/hw_adi_4_aux.h>
#include <inc/hw_aux_anaif.h> // Will change name to anaif
uint32_t AdcOneShotRead(uint8_t auxIo,uint8 reg)
{
uint32_t turnedOnClocks = 0;
//////////// Config clock/////////////////////
// Only turn on clocks that are not already enabled. Not thread-safe, obviously.
turnedOnClocks |= AUXWUCClockStatus(AUX_WUC_ADC_CLOCK) ? 0 : AUX_WUC_ADC_CLOCK;
turnedOnClocks |= AUXWUCClockStatus(AUX_WUC_ADI_CLOCK) ? 0 : AUX_WUC_ADI_CLOCK;
turnedOnClocks |= AUXWUCClockStatus(AUX_WUC_ANAIF_CLOCK) ? 0 : AUX_WUC_ANAIF_CLOCK;
// Enable clocks and wait for ready
AUXWUCClockEnable(turnedOnClocks);
while(AUX_WUC_CLOCK_OFF == AUXWUCClockStatus(turnedOnClocks));
/////// Seclect auxIO /////////////
AUXADCSelectInput(auxIo);
////////// Enable ///////////
AUXADCEnableSync(AUXADC_REF_FIXED, AUXADC_SAMPLE_TIME_2P7_US, AUXADC_TRIGGER_MANUAL);
// delay(10);
//Scaling disable
if(reg) AUXADCDisableInputScaling(); //本条没屏蔽,最大的ADC电压为1.49V,适合低电压检测
AUXADCGenManualTrigger(); // Trigger sample
// HWREG(AUX_ANAIF_BASE + AUX_ANAIF_O_ADCTRIG) = (1 << AUX_ANAIF_ADCTRIG_START_S);
uint32_t adcValue = AUXADCReadFifo();
AUXADCDisable();//Power_Saving
return adcValue;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
第一行是自己定义的一个头文件。
函数返回4字节的AD结果。
函数形参auxIo,代表对哪个通道进行采集。
函数形参reg,表示选择基准电压,基准电压有两个选择,详情见下方头文件中的定义。
如前几篇介绍的工程管理,这些文件,可以直接放在Application文件夹下。
原创博客,如有转载,注明出处——在金华的电子民工林。
头文件的内容如下:
#include <rom.h>
/*
#define ADC_COMPB_IN_NC 0x00
#define ADC_COMPB_IN_DCOUPL 0x03
#define ADC_COMPB_IN_VSS 0x04
#define ADC_COMPB_IN_VDDS 0x05
#define ADC_COMPB_IN_AUXIO7 0x09
#define ADC_COMPB_IN_AUXIO6 0x0A
#define ADC_COMPB_IN_AUXIO5 0x0B
#define ADC_COMPB_IN_AUXIO4 0x0C
#define ADC_COMPB_IN_AUXIO3 0x0D
#define ADC_COMPB_IN_AUXIO2 0x0E
#define ADC_COMPB_IN_AUXIO1 0x0F
#define ADC_COMPB_IN_AUXIO0 0x10*/
#define ADC_REG_4_3V FALSE
#define ADC_REG_1_49V TRUE
extern uint32_t AdcOneShotRead(uint8_t auxIo,uint8 reg);
上图中,屏蔽掉的部分,就是ADC的通道的选择,这个定义在rom.h里。
为了更直观,各位可以再把通道重新定义成更直观的,比如
#define ADC_CHANNEL_VDD ADC_COMPB_IN_VDDS
#define ADC_CHANNEL_IOID24 ADC_COMPB_IN_AUXIO0
具体应用,各位自己尝试。 |