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

 
 
 
Reply to this topicStart new topic
> F1611-ADC12: JTAG: при пошаговом проходе в ADC12MEM0 cчитываются правильные значения (как на железе),если же не останавливать на ADC12CTL0 |= ADC12SC;, то значения ~ в 2 раза больше.
*Leo*
сообщение Dec 21 2010, 19:49
Сообщение #1





Группа: Новичок
Сообщений: 3
Регистрация: 21-12-10
Пользователь №: 61 782



Что не так? Помогите плз малоопытному))

из main():

1) volatile float U[4];
//--------------------------- Конфигурация портов ---------------------------
.......
P6SEL |= 0xFF;
P6DIR = 0x00;
.......
2)
case cmCURRENT:
{
Counter=0;
SetADC_Current(); /// Настройка АЦП.
P2OUT &= ~UPRAKS1;
P2OUT |= ON1+ON2;
P2OUT &= ~ON3; ///
delay_ms(300); // (пробовал задержки и больше везде где можно, нужно только тут)
ADC12CTL0 |= ADC12SC; // Start conversion
while(ADC12CTL1&ADC12BUSY) // пока выполняется оцифровка...
{}

P2OUT |= ON3;
delay_ms(300);
ADC12CTL0 |= ADC12SC; // вкл. преобразование вручную // Start conversion
while(ADC12CTL1&ADC12BUSY) // пока выполняется оцифровка...
{}
// ADC12CTL0 &= ~ADC12SC;

P2OUT &= ~ON3;
P2OUT |= UPRAKS1; /// Вкл. акс.
delay_ms(300);
ADC12CTL0 |= ADC12SC; // вкл. преобразование вручную // Start conversion
while(ADC12CTL1&ADC12BUSY) // пока выполняется оцифровка...
{}

P2OUT |= ON3;
delay_ms(300);
ADC12CTL0 |= ADC12SC; // вкл. преобразование вручную // Start conversion
while(ADC12CTL1&ADC12BUSY) // пока выполняется оцифровка...
{}

P2OUT &= ~(UPRAKS1+ON1+ON2+ON3);
ResetADC();
..................................
}

ОБРАБОТКА ДАННЫХ С АЦП
#pragma vector=ADC_VECTOR
__interrupt void ADC12_ISR (void)
{
...................

else if(Command_USB ==cmCURRENT)
{
U[Counter++] = ADC12MEM0;
}
...............
}

void SetADC_Current()
{
ADC12CTL0 = ADC12ON | SHT0_7 | ADC12OVIE | ADC12TOVIE; //SHT0_0;
ADC12CTL1 = ADC12SSEL_3 | SHP | CSTARTADD_0;
ADC12MCTL0 = INCH_3 | SREF_0 | EOS; /// канал 4 - единственный, INCH_3
ADC12IE = 0x01; //08; /// разрешить нужное прерывание
for (int i=0; i<0x3600; i++) // выполнить настройки
{}
ADC12CTL0 |= ENC;
}

Сообщение отредактировал *Leo* - Dec 21 2010, 19:53
Go to the top of the page
 
+Quote Post
rezident
сообщение Dec 21 2010, 20:26
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Типовая ошибка. Определитесь работаете ли вы с АЦП по прерываниям, либо используете опрос флагов. Если второе, то не следует разрешать прерывания. Если первое, то будьте любезны корректно описать обработчик прерываний. Вот нафига зачем вы разрешили прерывания от АЦП по переполнению (бит ADC12OVIE) и по таймауту времени преобразования (бит ADC12TOVIE)? Вы же не используете режимы автоматического (конвейерного) преобразования, запуская ЦАП "вручную". Следовательно работа АЦП вам полностью подконтрольна и вы всегда успеете считать результат оцифровки до того, как будет запущен цикл нового преобразования, а указанные события прерываний возникать не должны. Кроме того, прерывания-то разрешены, а обработчика соответствующих состояний нету. Почитайте внимательно раздел 17.2.10 ADC12 Interrupts в User's Manual. У ADC12 есть 18 источников прерываний, которые идентифицируются в регистре ADC12IV, реализующем приоритеты и дополнительные векторы прерываний вдобавок к расшаренному вектору ADC12_VECTOR. Кстати, у вас даже символьное имя вектора неправильно указано.
Go to the top of the page
 
+Quote Post
*Leo*
сообщение Dec 22 2010, 10:52
Сообщение #3





Группа: Новичок
Сообщений: 3
Регистрация: 21-12-10
Пользователь №: 61 782



Цитата(rezident @ Dec 22 2010, 02:26) *
Типовая ошибка. Определитесь работаете ли вы с АЦП по прерываниям, либо используете опрос флагов. Если второе, то не следует разрешать прерывания. Если первое, то будьте любезны корректно описать обработчик прерываний. Вот нафига зачем вы разрешили прерывания от АЦП по переполнению (бит ADC12OVIE) и по таймауту времени преобразования (бит ADC12TOVIE)? Вы же не используете режимы автоматического (конвейерного) преобразования, запуская ЦАП "вручную". Следовательно работа АЦП вам полностью подконтрольна и вы всегда успеете считать результат оцифровки до того, как будет запущен цикл нового преобразования, а указанные события прерываний возникать не должны. Кроме того, прерывания-то разрешены, а обработчика соответствующих состояний нету. Почитайте внимательно раздел 17.2.10 ADC12 Interrupts в User's Manual. У ADC12 есть 18 источников прерываний, которые идентифицируются в регистре ADC12IV, реализующем приоритеты и дополнительные векторы прерываний вдобавок к расшаренному вектору ADC12_VECTOR. Кстати, у вас даже символьное имя вектора неправильно указано.


Cпасиба за ответ!
Как-то всё обычно с последовательностями по прерываниям работал, а с одиночным вот помесь получилась)) Прерывания АЦП все запретил, ADC12OVIE и ADC12TOVIE убрал - остатки были от разного рода попыток.
Считываю pyfxtybz теперь в main() без всяких прерываний:
..........
delay_ms(300);
ADC12CTL0 |= ADC12SC;
while(ADC12CTL1&ADC12BUSY)
{}
U[Counter++] = ADC12MEM0;
....................
Всё успевало и успевает преобразовываться, только все равно значения в ~2 раза больше, если нет останова на ADC12CTL0 |= ADC12SC;
Сбрасывать вроде ничего дополнительно не надо.. Я что-то еще упустил?

(#define ADC_VECTOR ADC12_VECTOR - это в msp430x16x.h у меня стоит. )
Go to the top of the page
 
+Quote Post
rezident
сообщение Dec 22 2010, 13:43
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Для единственного канала нет особой разницы какой из флагов (ADC12BUSY или ADC12IFGx) опрашивать, но я бы вам рекомендовал все же использовать соответствующий ADC12IFGx. Это так, между делом, замечание.
Поясните на цифрах, что значит значения в ~2 раза больше? У вас используется разница между AVCC и AVSS в качестве опоры. Какое входное напряжение или какой по уровню постоянной составляющей входной сигнал вы измеряете и какой код при этом получаете? Каково напряжение на выводе AVCC? AVSS соединен с DVSS?
Go to the top of the page
 
+Quote Post
*Leo*
сообщение Dec 24 2010, 03:56
Сообщение #5





Группа: Новичок
Сообщений: 3
Регистрация: 21-12-10
Пользователь №: 61 782



Короче, дело оказалось не в АЦП. Хоть вначале и кривовато, но и сразу, и потом считывались
одинаково правильные значения. Причем верные и те, что пошагово, и те, что в ~2 раза больше непошаговые.
Ключевой строкой оказалась delay(...)!
P2OUT |= ON3;
delay_ms(300);
ADC12CTL0 |= ADC12SC;
while(ADC12CTL1&ADC12BUSY)
{}
U[Counter++] = ADC12MEM0;
Смысл в том, что значения АЦП снимаются для измерения токопотребления схемы,
в 4-х состояниях. Задержка нужна, для устаканивания очередного состояния.
И в том, что при останове на ADC12CTL0 |= ADC12SC проц. находится в простое, а при
обычном проходе напряжение не успевает упасть после режима с вычислительной нагрузкой
на процессор: delay() или цикл и т.п. Явно виден скачок при включении и выключении задержки.
В зависимости от тактовой частоты, разница получается в единицы миллиампер.
По напряжению на АЦП у меня при тактовой 8 МГц получались как раз
значения ~ в 2 раза отличающиеся. По току если: ~7 мА с нагруженным процом
и ~3 мА в простое. К примеру, при 4 МГц : вместо 7 мА 5 мА. И т.д.
Вот такие вот дела))
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 3rd July 2025 - 23:40
Рейтинг@Mail.ru


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