请问下有没有ADC的例程,我现在检测电池电量,我利用SDK里面的驱动调用直接死机了,
我现在有个项目所有功能已完善就差电池电量检测了,请帮忙查找电池电量例程,谢谢!很急。。。。
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
请问下有没有ADC的例程,我现在检测电池电量,我利用SDK里面的驱动调用直接死机了,
我现在有个项目所有功能已完善就差电池电量检测了,请帮忙查找电池电量例程,谢谢!很急。。。。
haibin,
用下面的代码:这个是基于SmartRF06 和 CC2640 7x7的芯片写的,用的是smartRF06上的light sensor做输入,连的是M3的DIO23.
参考电压是固定的4.3V。
函数的输入参数是AUX的IO 7, 你就填0x80就行。
函数的输出就是你要的转成数字的值。
注意,如果你用其他尺寸的芯片,IO的配置会不一样,你得看一下TRM文档中的IO mapping和AUX的IO mapping.
#include <inc/hw_memmap.h> #include <driverlib/aux_wuc.h> #include <inc/hw_adi.h> #include <inc/hw_adi_4_aux.h> #include <inc/hw_aux_anaif.h> // Will change name to anaif // auxIo, see MUX3 Register (Offset = 3h) [reset = X] // auxIo, sensor controller engine IO, will map to M3's IO automatilcally // for DIO23, auxIO7, the value should be 80h, 0x80 uint16_t OneShotADC(uint8_t auxIo) { static __root uint16_t retval = 0xABBA; uint32_t turnedOnClocks = 0; // 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_SOC_CLOCK)?0:AUX_WUC_SOC_CLOCK; // Enable clocks and wait for ready AUXWUCClockEnable(turnedOnClocks); while(false == AUXWUCClockStatus(turnedOnClocks)); // Set ADC Config: Sample mode Synchronous, 3 cycles sample, Reset, Disable. HWREGB(AUX_ADI4_BASE + ADI_4_AUX_O_ADC0) = (0 << ADI_4_AUX_ADC0_SMPL_MODE_S) | (6 << ADI_4_AUX_ADC0_SMPL_CYCLE_EXP_S) | (0 << ADI_4_AUX_ADC0_RESET_N_S) | (0 << ADI_4_AUX_ADC0_EN_S ); // Set reference source: Keep powered when idle, Fixed Src 4.3V, Enable reference system HWREGB(AUX_ADI4_BASE + ADI_4_AUX_O_ADCREF0) = (1 << ADI_4_AUX_ADCREF0_REF_ON_IDLE_S) | (0 << ADI_4_AUX_ADCREF0_SRC_S) | (1 << ADI_4_AUX_ADCREF0_EN_S ); // Set TRIM values //HWREGB(AUX_ADI_BASE + ADI_4_AUX_O_ADCREF1) = (1 << ADI_4_AUX_ADCREF1_VTRIM_S) | // (0 << ADI_4_AUX_ADCREF1_ITRIM_S); // Connect the muxed AUX IO Channel, light sensor is DIO23, which is AUXIO7 on the 7x7 package //HWREGB(AUX_ADI4_BASE + ADI_4_AUX_O_MUX3) = auxIo; HWREGB(AUX_ADI4_BASE + 0x00000003) = auxIo; // Release ADC from reset and enable HWREGB(AUX_ADI4_BASE + ADI_4_AUX_O_ADC0) |= (1 << ADI_4_AUX_ADC0_RESET_N_S) | (1 << ADI_4_AUX_ADC0_EN_S ); // Control M3's Analog Interface. Set polarity for trigger, but we don't care. Set trig source to NO_EVENT. Enable ADC interface for the remaining register writes. HWREG(AUX_ANAIF_BASE + AUX_ANAIF_O_ADCCTL) = (0 << AUX_ANAIF_ADCCTL_START_POL_S) | (9 << AUX_ANAIF_ADCCTL_START_SRC_S ) | // 9 is NO_EVENT, which is what we want for software trigger (1 << AUX_ANAIF_ADCCTL_CMD_S); // // Trigger the ADC conversion HWREG(AUX_ANAIF_BASE + AUX_ANAIF_O_ADCTRIG) = (1 << AUX_ANAIF_ADCTRIG_START_S); // Wait until it's finished (when fifo is not empty) while ( 1 == (HWREG(AUX_ANAIF_BASE + AUX_ANAIF_O_ADCFIFOSTAT) & AUX_ANAIF_ADCFIFOSTAT_EMPTY) ); // Read out value from FIFO retval = HWREG(AUX_ANAIF_BASE + AUX_ANAIF_O_ADCFIFO); // Clean up. // Disable reference system HWREGB(AUX_ADI4_BASE + ADI_4_AUX_O_ADCREF0) &= ~(1 << ADI_4_AUX_ADCREF0_EN_S ); // Turn off clocks AUXWUCClockDisable(turnedOnClocks); // Turn off ADC module HWREGB(AUX_ADI4_BASE + ADI_4_AUX_O_ADC0) = (0 << ADI_4_AUX_ADC0_RESET_N_S) | (0 << ADI_4_AUX_ADC0_EN_S ); return retval; }
haibin,
这个代码对于功耗是默认跟着整个系统走的,如果系统进入低功耗,这段代码也将会停止执行。
而且这段代码完整配置了ADC模块,但是只是单独的一次数据读取,如果需要读取多次的,你需要多次从fifo里面去读。
代码是测试过的,数据会变,你要确认pin mux之类的是否正确。
我用一个周期事件不断读取light sensor传感器的值,
IO口设置没有更改过,直接用你给的代码,谢谢!
if(events & SBP_POWER_ADC_EVT)
{
uint16 adc_value=0;
events &= ~SBP_POWER_ADC_EVT;
extern uint16 OneShotADC(uint8 auxIo);
adc_value=OneShotADC(0x80);
LCD_WRITE_STRING_VALUE("battey value",adc_value,10, LCD_PAGE7);
Util_startClock(&adc_periodicClock);
}
haibin,
你可以直接拿smartRF06+2640的7x7板子去测,很简单,把这个代码加到你的main函数,用手遮挡light sensor,你能看到每次的返回值都是会根据light sensor采集到的不同光线反应不同值的。
这个我这边早上刚试过,是可以的。
如果还有问题,那么你得看一下你的板子的pin mux了。
祝你好运!
haibin,
如果你用的是和我一样的环境,是不需要修改的,直接把手遮住light sensor 就能看到区别了。
如果你用的不是7x7板子,或者你自己的板子,那么你就得把你相应的IO口留出来,然后去对照TRM的872页去看一下对应的AUX的IO和M3的IO对应关系,然后再配参数。
haibin,
最好不要直接连VCC,建议分压算一下。
你要看1303页的MUX3寄存器。
这个寄存器的配置TI是不公开的,以后会以API的形式给出,但是你可以用我给你的方法去配。原理是按位来配置对应的AUX的模拟IO口。
haibin,
你这个太老了,是Alpha版本的。
正式release版本:http://www.ti.com/lit/ug/swcu117a/swcu117a.pdf
另外,你的芯片是正式版本的吗?
请问关于AD的问题解决了没有,我这边和你遇到了同样的问题,请问你是怎么解决的?谢谢
解决了,我是用工具配置的,Sensor Controller Studio
Sensor Controller Studio这个工具有例程的,你自己可以去好好看看
不是的,是要移植整个工程,你去看看我说的那个工具,你也可以配合工具是测试一下,有文档讲解的
我用软件自动生成的程序测试了一下,发现还是会死在程序读取的地方。大神,求指导。
peter zhang2:您好,请问您这个问题解决了吗?是怎么解决的?希望指点一下。
haibin deng 说:把生成的所有代码当做一个任务加入到现有的工程中
deng,你好,你的意思是比如说simpleBLEPeripheral中新创建一个task,然后把SCS生成的代码放进去么?
能否具体点呢?是把SCS获得的.c/.h文件都加到用户工程中,然后分初始化和任务操作?我弄了一下,感觉很别扭弄不起来
那如何把Sensor Controller Studio中生成的代码驱动,放到SimpleBLEPeripheral工程中呢?
hi peter,
问一下,为什么ALS工程:非rtos工程中断函数ADC取值只能进去一次,rtos工程的task也只能进去一次?SCS的ADC采样的代码流程逻辑哪里有说明么?
谢谢
AONBatMonEnable();
AONBatMonMeasurementCycleSet(AON_BATMON_CYCLE_32);
AONBatMonBatteryVoltageGet();
哥们儿,现在我用4x4的片子,现在的手册不让看寄存器的值,说是只能调用提供的API,但是我用API写出来的根本没发用,运行就卡在程序那。
uint32_t OneShotADC(void)
{
AUXADCEnableSync(AUXADC_REF_FIXED, AUXADC_SAMPLE_TIME_2P7_US, AUXADC_TRIGGER_MANUAL);
AUXADCSelectInput(ADC_COMPB_IN_AUXIO3);//AUXIO3对应的就是IO9 (4x4ms)
for (int i = 5000; i > 0; i--);
return (AUXADCReadFifo()); // AUXADCDisable();
}
现在寄存器看不到也不能用你写的代码进行修改,我自己写的还不行,这可怎么办?难道非要让我用SCS写?