mrengineer (09.04.2012 15:36, просмотров: 18594)
Хочу измерить напряжение питания батареи. Но получаю странное напряжение. http://olimex.com/dev/msp-ccrf.html
Плата - смотрите ссылку. Там есть схема и распиновка.
Сделал делитель: Vsupl->10k-3.3k-ЗЕМЛЯ. Между резисторами снимаю напряжение. При Vsupl = 3.5В получаю около 0.8В. Но стоит только подключить на P2.0==A0, как оно уже 1.7В! Подайте идею почему?
Нога инициализирована корректно, т.к. соседние A1, A2, A3 читают напряжение корректно с подключенного на них датчика. А инициализация и чтение ведутся для A0 и A1..3 аналогичными кодами:
void InitADC12(void) {
/* ADC12 Control Register 0 */
// ADC12 sample-and-hold time -> 256 x ADC12CLKs,
// Referance = 2.5V, Select ADC12MEM0
// ADC12CTL0 = SHT03;
// Sample-and-hold source select -> ADC12SC bit, no clock divider,
// clock -> ADC12OSC - internal osillator ~5MHz, Single-channel and single-conversion
ADC12CTL1 = ADC12SHP;
// Sample-and-hold source select -> ADC12SC bit, no clock divider,
// clock -> MCLK - external osillator ~2MHz, Single-channel and single-conversion
// ADC12CTL1 = ADC12SSEL1+SHP;
ADC12CTL1 = ADC12SSEL1;
// Conversion Memory Control Registers
// Select reference -> VR+ = AVCC+ and VR– = AVSS
ADC12MCTL0 = 0x0;
P2DIR &= ~(BIT0|BIT1|BIT2|BIT3); // P2.0, P2.1, P2.2 and P2.3 -> input direction
//~ áèòû îáðàùàåò óêàçàííûå áèòû â íîëü
//& Îñòàâëÿåò ðàâíûìè 1 òîëüêî òå áèòû, ãäå áûëè åäèíèöû è â ïðèáàâëÿåìîì òîæå åäèíèöû:
// 00101 &
// 01001 =
// 00001
// P2SEL |= (BIT0|BIT1|BIT2); // P2.1 P2.2 P2.3 -> ADC12 function
P2SEL |= (BIT1|BIT1|BIT2|BIT3); //P2.0, P2.1 P2.2 P2.3 -> ADC12 function
}
и
unsigned int GetADC12_A0(void) {
// measured value
unsigned int val = 0;
// clear
ADC12MCTL0 = 0;
// ADC12 on
ADC12CTL0 |= ADC12ON;
// Input channel select -> A0
ADC12MCTL0 |= ADC12INCH_0;
// Enable and start conversion
ADC12CTL0 |= (ADC12SC + ADC12ENC);
ADC12CTL0 &= ~ADC12SC;
// wait end of conversion
while (ADC12CTL1 & ADC12BUSY);
// Clear interrupt flag
ADC12IFG = 0;
// get ADC value
val = ADC12MEM0;
// Disable and stop conversion
ADC12CTL0 &= ~(ADC12SC + ADC12ENC);
// ADC12 off
// ADC12CTL0 &= ~ADC12ON;
// return value
return val;
}