Процессор: MSP430F4152
АЦП: 10 разрядный
Делаю измерение температур по двум каналам АЦП.
АЦП работает в непрерывном режиме.
Проблема: АЦП сильно шумит, т.е. значение регистра ADC10MEM "гуляет" примерно от 260 до 270 единиц.
Т.е. "гуляют" 4 младших разряда. Это нормально или плохо?
Соответсвенно измеренная температура гуляет на +- 1 градус
Что делать, где ошибка?
Схему не могу выложить, мне запрещено. Но схема измерения как тут: http://avr-start.ru/?p=590
Даташит: https://yadi.sk/i/nGysJKVFibvYc
Код:
CODE
#include "adc.h"
float32_t dataArray[32] = {0};
uint16_t ADC10CTL1_mask;
void initADC(void)
{
ADC10AE0 |= 0x03; // P7.4, P7.5 ADC option select
//ADC10CTL0 = ADC10ON + ADC10SHT_0 + MSC + REF2_5V + REFON; // Turn on ADC10, set sampling time
ADC10CTL0 = ADC10ON + MSC; // Turn on ADC10, set sampling time
ADC10CTL1 |= CONSEQ1;
ADC10CTL0 |= ENC; // Enable conversions
ADC10CTL0 |= ADC10SC; // Start convn - software trigger
}
void stopADC(void)
{
ADC10CTL0 = 0; // Start convn - software trigger
}
float32_t getTemperatureFromChannel(uint8_t channelNum)
{
initADC();
P2DIR = 0x03; // "1" на выход для датчиков
P2OUT = 0x03;
__delay_cycles(1000);
ADC10CTL1 &= 0xFFF; // очистим биты 12..15
ADC10CTL1 |= channelNum << 12; // установим биты 12..15
float32_t data = ADC10MEM*0.1318-10.6422;
dataArray[channelNum] = data;
P2OUT = 0;
stopADC();
return data;
}
float32_t dataArray[32] = {0};
uint16_t ADC10CTL1_mask;
void initADC(void)
{
ADC10AE0 |= 0x03; // P7.4, P7.5 ADC option select
//ADC10CTL0 = ADC10ON + ADC10SHT_0 + MSC + REF2_5V + REFON; // Turn on ADC10, set sampling time
ADC10CTL0 = ADC10ON + MSC; // Turn on ADC10, set sampling time
ADC10CTL1 |= CONSEQ1;
ADC10CTL0 |= ENC; // Enable conversions
ADC10CTL0 |= ADC10SC; // Start convn - software trigger
}
void stopADC(void)
{
ADC10CTL0 = 0; // Start convn - software trigger
}
float32_t getTemperatureFromChannel(uint8_t channelNum)
{
initADC();
P2DIR = 0x03; // "1" на выход для датчиков
P2OUT = 0x03;
__delay_cycles(1000);
ADC10CTL1 &= 0xFFF; // очистим биты 12..15
ADC10CTL1 |= channelNum << 12; // установим биты 12..15
float32_t data = ADC10MEM*0.1318-10.6422;
dataArray[channelNum] = data;
P2OUT = 0;
stopADC();
return data;
}