I am trying to use two Wixels, one as a sender and one as a receiver. The sender will get a signal and send a signal to the receiver which will then act as a keyboard emulator.
The problem I am having is the battery I am using, CR2032 (small I know) won’t last long at all. I have heard there are ways to make these things run on almost no power. I am only using one input on the sending side. The sending side is where the battery is. The receiver side is plugged to USB.
I have looked on the forums and have seen some ideas but not much for this application. If anyone has ideas or a solution I would love to hear it.
One way to save some power is to make sure that all of the I/O lines on the Wixel are either set as outputs or pulled high or low. An input line at some intermediate voltage can consume extra current. Another way to save power is to put the CC2511F32 in sleep mode when you are not using it. Also, you can reduce power consumption if you do not need the 3.3V regular on the Wixel and want to sever the output pin of the regulator and power the board directly from the 3V3 line. You can find more details about this and other tips for minimizing your Wixel’s power consumption (including some sample code) in this thread.
The thread you referred to is from back in 2008. At that time they seemed to be discussing including the ability to use sleep modes into the standard Wixel SDK. Has that been accomplished? If so, where do I find its documentation?
I too have been re-visiting the whole matter of putting the wixel into a minimum power mode. In my case, I’m going into permanent sleep to protect a LiPO cell from excessive drain, so it never has to come back to life until power is cycled. I’m investigating external circuits to accomplish this too, mainly to avoid having to modify the regulator on multiple wixels. I have many reasons for this, as explained below. But assuming I do the regulator modification, these are the concerns that come to mind.
If I power the wixel directly from the LiPO cell, it will normally see about 3.7V. But… a fully charged LiPO may output as much as 4.2V. Would you agree that this voltage might fry the MCU, or do you think it has some tolerance there?
I do the ADC in my application, both to monitor a potentiometer that is referenced to the 3V3 source, and also to monitor the supply voltage so I’ll know when my battery is low and needs to be protected. I know the wixel has a lower internal regulated reference it can use, but I’d be hard pressed to get accurate potentiometer readings without another regulator in my circuit, which means I’d be back to square one, correct?
My application already has 10K pullups on P2_1 and P2_2, and the wixel that needs the protection only transmits. Do i still need to worry about turning off the radio?
How do I turn off the ADC prior to sleep mode?
Do I need to do anything beyond the below to go to sleep mode 2?
A supply voltage of 4.2 V would exceed the CC2511F32’s absolute maximum rating for VDD, which is listed in Section 3 of the CC2511F32 datasheet, so it could damage the MCU if you are supplying that power directly to the Wixel’s 3V3 pin without a regulator.
I am not sure why you think a regulator is necessary in order to get accurate potentiometer readings. If the potentiometer is powered by the same voltage that powers the CC2511F32 processor, then the raw ADC reading should stay the same even as that voltage falls. For example, if your VDD falls by 10%, then the voltage on the potentiometer’s output would also fall by 10%, so the raw ADC reading should stay the same and still be a good indication of the position of the potentiometer.
Why are you pulling up P2_1 and P2_2? For low-power operation you would want to pull down those lines or just drive them low.
The radio consumes current when it is on, so you should consider turning it off if your goal is to conserve power. You might want to calculate the amount of current that can be saved by turning off the radio and how much it would extend your battery life.
All the information we have about turning off the ADC can be found in the CC2511F32 datasheet. It looks like there is no special bit available that can turn off the ADC, so it probably just turns itself off after it is done performing a conversion.
The code you posted looks like it will put the Wixel into sleep mode 2. To minimize the power consumption of the board while you are in that mode, I recommend referring to my earlier post on that subject:
Your code looks similar to the code in that post except there are some I/O pins that you are setting to inputs which were set as outputs in the code I posted. The reason I made those pins be outputs in that code was to prevent the extra power consumption that happens when you have an input that is at an intermediate voltage. If you want to conserve power, you should make sure that the voltage on all of your pins is either at 0 V or VDD.
Its sounding like I need to pursue an external battery shutdown circuit, since I’ll need the regulator to ensure I’m powering the wixel safely under any battery voltage condition. But in case that changes and I do remove the regulator, let me make sure I understand the A/D issues. First, you make a good point about the raw A/D counts remaining proportional to the reference voltage regardless of how that voltage changes. That that pretty much saves my potentiometer position detection scheme. Now as for detecting the low battery situation, up to now, I’ve been occasionally doing something like this…
uint16 vddMillivolts = adcReadVddMillivolts();
if (vddMillivolts < (uint16)param_lowVoltageCutoff) gotoSleep()
Through experimentation I found that setting param_lowVoltageCutoff = 2500 would trigger my sleep call when the cell had reached 2700 (2.7V). The regulator circuit, when underpowered, seemed to reliably drop about 0.2V. Now if the regulator is removed and I power the circuit directly through the 3V3 pin, I suppose I’d have to adjust my lowVoltageCutoff to 2700, since there won’t be a loss across the regulator circuit anymore. But adcReadVddMillivolts() is based on the internal 1.25V reference, so the method should still be able to detect the battery dropping, correct?
Yes, the adcReadVddMillivolts function uses the 1.25 V internal reference so it should still be able to detect your battery voltage dropping. I do not see any problem with your plan to change param_lowVoltageCutoff from 2500 to 2700.