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

 
 
> Измерение напряжения с помощью АЦП, 16 битное SD16_A
chainikru
сообщение Apr 9 2012, 10:58
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 24
Регистрация: 5-12-11
Пользователь №: 68 682



Добрый день. Хочу поставить индикатор на регулятор мощности, для этого я хочу дополнить регулятор MSP430F2013 на аналоговые входы которого я буду подавать уменьшенный сигнал и измеряя напряжение с помощью АЦП выводить его значение в процентах. Для этого сделал для отлатки устройство с регулируемым напряжением до 0.59 вольт . Как я понял для написания пограммы надо сделать таблицу соответствия напряжения его цифрвому коду в АЦП .
Вот моя программа для этой цели где результат преобразования напряжения хранится в ChA0results:
#include <msp430x20x3.h>

/* Arrays to store SD16 conversion results */
/* NOTE: arrays need to be global to */
/* prevent removal by compiler */
static unsigned int ChA0results = 0x00;

static unsigned int ch_counter=0;

void main(void)
{

volatile unsigned int i; // Use volatile to prevent removal
// by compiler optimization

WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
BCSCTL2 |= DIVS_3; // SMCLK/8

SD16CTL = SD16REFON + SD16SSEL_1; // 1.2V ref, SMCLK
SD16INCTL0 = SD16INCH0; // Set channel A0+/-
SD16CCTL0 |= SD16SNGL + SD16UNI + SD16IE;
// Single conv, 256OSR, unipolar,
// enable interrupt
SD16INCTL0 |= SD16INTDLY_0; // Interrupt on 4th sample
SD16AE = SD16AE0; // P1.0 A0+, A0- = VSS

for (i = 0; i < 0x3600; i++); // Delay for 1.2V ref startup

while(1)
{
SD16CCTL0 |= SD16SC; // Set bit to start conversion
_BIS_SR(LPM0_bits + GIE); // Enter LPM0
}
}

#pragma vector = SD16_VECTOR
__interrupt void SD16ISR(void)
{
switch (SD16IV)
{ case 2: // SD16MEM Overflow
break;

case 4: // SD16MEM0 IFG

switch(ch_counter)
{
case 0:
ChA0results = SD16MEM0; // Save CH0 results (clears IFG)
SD16AE &= ~SD16AE0; // Disable external input A0+, A0
SD16INCTL0 &= ~SD16INCH_0; // Disable channel A0+/-
ch_counter++;

SD16AE = SD16AE0; // Reset external input to A0+/-
SD16INCTL0 = SD16INCH_0; // Reset channel observed
break;
}

_BIC_SR_IRQ(LPM0_bits); // Exit LPM0

}
}
Но у меня проблема с недопонимание работы этого АЦП. Я подаю напряжение на канал A0 и вижу результат на SD16MEM0 он его благополучно заносит в ChA0results. Но эти значени при каждом перезапуске программы разные. Подскажите пожалуйста как решить эту проблему и составить таблицу:для
0.59В-"результат преобразования" , 0.531В- , 0.472В- , 0.413В- , 0.354В- , 0.295В- , 0.236В- , 0.177В- , 0.118В- , 0.059В.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
MrYuran
сообщение Apr 9 2012, 11:56
Сообщение #2


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



А зачем таблицу?
Намного проще тупо пересчитывать.
Одно действие - умножение кода на коэффициент пересчета


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
chainikru
сообщение Apr 9 2012, 13:38
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 24
Регистрация: 5-12-11
Пользователь №: 68 682



Цитата(MrYuran @ Apr 9 2012, 15:56) *
А зачем таблицу?
Намного проще тупо пересчитывать.
Одно действие - умножение кода на коэффициент пересчета

А как или что вы имеете в виду под словом пересчитать? я ведь не знаю какой код будет на выходе АЦП при подаче того или иного значения напряжения. Ну а таблицу я не имею ввиду как таковую, я просто хочу знать какой код будет соответствовать тому или иному напряжению.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Apr 9 2012, 14:07
Сообщение #4


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(chainikru @ Apr 9 2012, 17:38) *
А как или что вы имеете в виду под словом пересчитать? я ведь не знаю какой код будет на выходе АЦП при подаче того или иного значения напряжения.

А зачем его знать - пусть машина думает.
Полная шкала АЦП соответствует напряжению опоры.
То есть, если опора, скажем, Vref=1.5В, то Vin = Vref * (Code/0xFFFF)
Ну, ещё могут быть нюанс в зависимости от режима АЦП (дополнительные коэффициенты, смещение шкалы, изменение разрядности итд.)


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 29th July 2025 - 08:34
Рейтинг@Mail.ru


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