реклама на сайте
подробности

 
 
> Проблемы со встроенным датчиком температуры, MSP430F2013
Grigorij
сообщение Mar 11 2010, 08:17
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 71
Регистрация: 10-03-07
Пользователь №: 26 038



Здравствуйте.

Никак не получается добиться адекватной работы встроенного датчика температуры
в 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 В
- из-за отсутствия других идея впаял в плату новый МК - тоже не помогло

Чувствую, что где-то на ровном месте спотыкаюсь, но никак не могу понять где.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
VVlad
сообщение Mar 11 2010, 15:07
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 67
Регистрация: 7-12-09
Пользователь №: 54 109



Здравствуйте, Григорий.
У меня была похожая неувязка, правда, диапазон прижимался не к верхнему краю (50000-65535), а к нижней четверти
(0-16383). Дело было именно в протоколе передачи. Думаю, стоит привести подпрограмму UART, тогда я с удовольствием помог бы. Лучше присылайте на vldu(cobak)itaec.ru
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 14:18
Рейтинг@Mail.ru


Страница сгенерированна за 0.01549 секунд с 7
ELECTRONIX ©2004-2016