Здравствуйте.
Никак не получается добиться адекватной работы встроенного датчика температуры
в MSP430F2013. На комнатной температуре код АЦП 6-го канала (датчик температуры)
всегда находит в диапазоне от ~50000 до 65535, что несколько противоречит datasheet-у.
Ниже программа (код, реализующий UART приводить не стал, т.к. в нем сомнений нет),
которую я использовал для проверки работы датчика:
Код
#include <msp430x20x3.h>
#include <intrinsics.h>
#include "Types.h"
#include "UART.h"
volatile INT16U __ADCResult__;
void InitADC(void)
{
SD16AE = 0x00;
//внутренний источник опорного напряжения
//тактирование SMCLK / 48
SD16CTL = SD16SSEL_1 + SD16REFON + SD16DIV_3;
// AIN6 - датчик температуры
SD16INCTL0 = SD16INCH_6;
//одиночно преобразование
//униполярный режим
//прерывания разрешены
SD16CCTL0 = SD16SNGL + SD16UNI + SD16IE;
}
void StartSingleADC(void)
{
SD16CCTL0 |= SD16SC;
}
void InitSFR(void)
{
//VLOCLK
BCSCTL3 = LFXT1S_2;
BCSCTL2 = SELM_0;
//DCO = 1 MHz, MCLK = SMCLK = 1 MHz
BCSCTL1 = CALBC1_1MHZ;
DCOCTL = CALDCO_1MHZ;
//задержка для стабилизации генератора
for (INT16U i = 0; i < 65535; i ++)
__no_operation();
P1SEL = 0X00;
P2SEL = 0x00;
P1DIR = 0xFF;
P2DIR = 0xFF;
InitADC();
InitUART();
}
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
InitSFR();
StartSingleADC();
while (TRUE)
{
__bis_SR_register(CPUOFF + GIE);
//отправка результата измерения на ПК
SendUARTByte( (INT08U)(__ADCResult__ >> 8));
SendUARTByte( (INT08U)(__ADCResult__ & 0x00FF));
for (INT16U i = 0; i < 50000; i++)
__no_operation();
StartSingleADC();
}
}
#pragma vector = SD16_VECTOR
__interrupt void SD16A_ISR(void)
{
if (SD16CCTL0 & SD16IFG)
{
__ADCResult__ = SD16MEM0;
__bic_SR_register_on_exit(CPUOFF);
}
}
Пробовал:
- изменять источник тактирования АЦП - не помогло
- для проверки внутреннего источника опорного напряжения вывел его наружу - на Vref = 1.2 В
- проверил питание - Vcc = 3 В
- из-за отсутствия других идея впаял в плату новый МК - тоже не помогло
Чувствую, что где-то на ровном месте спотыкаюсь, но никак не могу понять где.