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

 
 
4 страниц V  < 1 2 3 4 >  
Closed TopicStart new topic
> MSP430 - вопросы от чайника, генератор опорного напряжения
Daria
сообщение Jun 6 2008, 21:01
Сообщение #16


Местный
***

Группа: Участник
Сообщений: 229
Регистрация: 24-02-08
Пользователь №: 35 345



Большое спасибо! Сделаю в точности так, как вы говорите. А изменяю длительность именно так - меняю TACCR0, компилируюсь, загружаю и смотрю smile.gif И никакой таинственной программы пока по сути нет - набрасываю просто куски, учусь smile.gif
Спасибо еще раз

Сообщение отредактировал Daria - Jun 6 2008, 21:03
Go to the top of the page
 
+Quote Post
Daria
сообщение Jun 8 2008, 17:22
Сообщение #17


Местный
***

Группа: Участник
Сообщений: 229
Регистрация: 24-02-08
Пользователь №: 35 345



Здравствуйте, снова я smile.gif Опять проблемы
привожу весь свой маленький текст, чтобы не ругались потом. будто что-то скрываюsmile.gif
#include <msp430x14x.h>

void main(void)
{
int i, Vs, Vr;

WDTCTL = WDTPW + WDTHOLD;

P1SEL |= BIT6;
P3SEL = BIT4 + BIT5;
P6SEL = 0xF8;
P1DIR |= BIT5;
P1OUT = BIT5;

CCTL0 = OUTMOD_4 ;
TACCR0 = 65000;
BCSCTL1 = XTS + XT2OFF;
BCSCTL2 = SELM0;

do
{
IFG1 &= ~OFIFG;
for (i = 0xFF; i > 0; i--);
}
while ((IFG1 & OFIFG));

BCSCTL2 = SELM_3;

TACTL = TASSEL_1 + ID_3;

ADC12CTL0 = SHT0_12 + ADC12ON + REFON;
ADC12CTL1 = CSTARTADD0 + CSTARTADD1 + ADC12SSEL_1 + CONSEQ_1;
ADC12MCTL3 = INCH_3;

ADC12CTL0 |= ENC;


_BIS_SR(U0CTL & SWRST);

ME1 |= UTXE0 + URXE0;
U0CTL |= CHAR;
U0TCTL = SSEL0;
U0BR0 = 0xA0;
U0BR1 = 0x01;
U0MCTL = 0x00;
U0CTL &= ~SWRST;
IE1 |= URXIE0;
_BIS_SR(GIE);

i = 1;

TACTL |= MC_1 ;

for(;;)
{

if (TACCTL0 & CCIFG)
{
if (P1OUT & BIT5)
{
ADC12CTL0 |= ADC12SC + ENC;
ADC12CTL0 &= ENC;
if (ADC12IFG)
{
Vr = ADC12MEM3;

TXBUF0 = ((Vr-Vs)/2 & 0xFF);



send_int(conv[j]);
}


TACCTL0 &= !CCIFG;
i++;
if (i >= 918 )
{
TACCR0 = 400;
P1OUT = 0;
i = 0;
}
if (i == 1)
{
P1OUT = BIT5;
ADC12CTL0 |= ADC12SC + ENC;
ADC12CTL0 &= ENC;
Vs = ADC12MEM3;


TACCR0 = 65000;

}
}
}
}
Чего, как я думаю, здесь делается - включаю таймер в режим переключения, в TACCR0 - 65000 тактов, вывод держу в единице, пока не поризойдет 918 переключений, затем переписываю счетчик на 400, переключаю вывод в ноль, после следующего переключения, снова в единицу, и снова переписываю счетчик в 65000 тактов. Т.е. хочу минуту держать вывод в единице, затем 400 мкс в нуле, и так все время работы. Вовремя коротких импульсов, считываю уровень с вывода P6.3, записываю как Vs, во время длинных - как Vr, потом считаю (Vr-Vs)/2 и посылаю на COM. То, что буфере один байт, а число получается двухбайтовым, я знаю smile.gif , посылаю пока младший байт, не в этом суть.
В ЧЕМ ПРОБЛЕМА - напряжения на P6.3 только положительные, нужно при преобразовании АЦП получать положительные и отрицательные числа. Формула преобразования АЦП по даташиту - 4095*(Vin - V-)/(V+- V-) Питание - 3,3 В. Опорное напряжение Vref+ = 1.5В. Как мне правильно сконфигурировать АЦП? CONSEQ_1 означает, что V- = 0, V+ = 3.3. Более подходящего варианта не вижу. Но как указать, что ноль переносится в 1,5? Или
каждый раз писать Vr - 4095*1.5/3.3 - извините за глупые вопросы, но вот непонятно 05.gif
И вообще, если кому-то вдруг не лень будет почитать текст - есть ли здесь ошибки при конфигурировании АЦП или USART?
Заранее огромное спасибо
Go to the top of the page
 
+Quote Post
Daria
сообщение Jun 8 2008, 18:50
Сообщение #18


Местный
***

Группа: Участник
Сообщений: 229
Регистрация: 24-02-08
Пользователь №: 35 345



на строчку send_int не обращайте внимания, она осталась от старой, уже удаленной функции. И, конечно, Vs перед for(;;); определяется как Vs=0; smile.gif

Сообщение отредактировал Daria - Jun 8 2008, 18:50
Go to the top of the page
 
+Quote Post
Daria
сообщение Jun 9 2008, 19:52
Сообщение #19


Местный
***

Группа: Участник
Сообщений: 229
Регистрация: 24-02-08
Пользователь №: 35 345



Нет, тут опять ошибки biggrin.gif Vs вычисляется после P1OUT = 0; и CONSEQ_1 не нужен, в данном случае однократное преобразование.
И вот еще - я записываю функцию, которая передает два байта, так
void send_int(int a)
{
while (!(IFG1 & UTXIFG0));
TXBUF0 = (a & 0x3F);
while (!(IFG1 & UTXIFG0));
TXBUF0 = (a>>6);
while (!(IFG1 & UTXIFG0));
TXBUF0 = 0xFF;
}
0xFF - флаг, АЦП двенадцатиразрядный. Сначала 6 бит, потом еще 6, потом флаг.
Как можно это сделать проще?
Ау, кто-нибудь smile.gif
Go to the top of the page
 
+Quote Post
АДИКМ
сообщение Jun 9 2008, 20:24
Сообщение #20


Знающий
****

Группа: Свой
Сообщений: 630
Регистрация: 2-08-05
Пользователь №: 7 294



Посылать по 6 бит никто не запрещает конечно, но все таки лучше посылать например сначала младший байт, потом старший . а уже в компьютере их склеивать. Тем более, что ничего вы не теряете.


примерно так -
mov &adc12mem0 , r10 - копируем результат измерения
mov.b r10, &TXBUF0 - передаем младший байт
ждем UTXIFG0
swpb r10
mov.b r10, &TXBUF - передаем старший байт
ждем UTXIFG0




я бы порекомендовал вам посмотреть на эту книгу. там очень хорошо описаны многие вопросы, правда на английском


--------------------
летаю на пепелаце...
Go to the top of the page
 
+Quote Post
Daria
сообщение Jun 9 2008, 20:47
Сообщение #21


Местный
***

Группа: Участник
Сообщений: 229
Регистрация: 24-02-08
Пользователь №: 35 345



Цитата(АДИКМ @ Jun 10 2008, 00:24) *
Посылать по 6 бит никто не запрещает конечно, но все таки лучше посылать например сначала младший байт, потом старший . а уже в компьютере их склеивать. Тем более, что ничего вы не теряете.

Проблема в том, как потом записать флаг. Любое число не будет уникальным, если младший байт будет 8-ми битовым. А так получается, что 0xFF никогда не может прийти в младшем байте. Мысль была такая. smile.gif Или я чего-то не понимаю? sad.gif
Книгу обязательно почитаю, спасибо
Go to the top of the page
 
+Quote Post
АДИКМ
сообщение Jun 9 2008, 21:10
Сообщение #22


Знающий
****

Группа: Свой
Сообщений: 630
Регистрация: 2-08-05
Пользователь №: 7 294



Цитата(Daria @ Jun 9 2008, 23:47) *
Проблема в том, как потом записать флаг. Любое число не будет уникальным, если младший байт будет 8-ми битовым. А так получается, что 0xFF никогда не может прийти в младшем байте. Мысль была такая. smile.gif Или я чего-то не понимаю? sad.gif
Книгу обязательно почитаю, спасибо


Расскажите, что это за флаг и почему число должно быть уникальным? Далее, что Вы измеряете и какой амплитуды у Вас сигнал? С какой позиции выбрано опорное 1.5 В, а не 2.5 или 3.3 ?
Если Вы передаете данные в компьютер, то гораздо проще переложить вычисления на него. Ну или расскажите, что Вы задумали сделать.


--------------------
летаю на пепелаце...
Go to the top of the page
 
+Quote Post
rezident
сообщение Jun 9 2008, 21:21
Сообщение #23


Гуру
******

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



Цитата(Daria @ Jun 8 2008, 23:22) *
Здравствуйте, снова я smile.gif Опять проблемы
привожу весь свой маленький текст, чтобы не ругались потом. будто что-то скрываюsmile.gif
Текст программы пока комментировать не буду, лучше после уточнений приведу для сравнения свой вариант. Сделаю лишь несколько замечаний.
1. Не следует надеятся на значения регистров периферии, устанавливаемых состояниями POR/PUC. При инициализации их прописывайте явно значения, а не накладывайте маски.
2. Сначала обычно инициализируются функции всех пинов и система тактирования. Потом инициализируются периферийные модули, разрешается работа этих модулей, при необходимости прерывания. Затем устанавливается глобальный флаг прерываний и запускаются таймеры. Я обычно делаю в такой последовательности.
3. При склеивании отдельных битов в байт/слово, вместо операции + (сложение) следует использовать | (побитовое ИЛИ). Это позволяет избежать недоразумений при случайном дублировании одинаковых бит.
Цитата(Daria @ Jun 8 2008, 23:22) *
Чего, как я думаю, здесь делается - включаю таймер в режим переключения, в TACCR0 - 65000 тактов, вывод держу в единице, пока не поризойдет 918 переключений, затем переписываю счетчик на 400, переключаю вывод в ноль, после следующего переключения, снова в единицу, и снова переписываю счетчик в 65000 тактов. Т.е. хочу минуту держать вывод в единице, затем 400 мкс в нуле, и так все время работы.
Логичнее было бы использовать таймер в режиме переполнения Continious. А интервалы отсчитывать по прерыванию от регистра совпадения CCRx. При тактировании таймера частотой 1МГц для отсчета 60 секунд нужно 915 раз к текущему значению прибавлять максимальное число 65536 или просто 915 раз пропускать это суммирование. На 916-й раз добавить к текущему значению CCRx число 34560 и следующее прерывание от CCRx будет соответствовать 60с интервалу. Тут же в прерывании добавляем к текущему значению CCRx число 400 и опять-таки следующее прерывание будет соответствовать интервалу 400мкс. Затем по-новой игнорируем 915 раз в прерывании суммирование и т.д. А если еще задействовать аппаратное управление выходом TAx, то получиться совсем кошерно и точно. Ваш сигнал что-то реально переключает или используется в качестве индикации состояния? Допустимо ли его "переключательную" функцию переместить на пин, который может выполнять выходную функцию TAx? Например, на P1.1 или P1.2?
Цитата(Daria @ Jun 8 2008, 23:22) *
Вовремя коротких импульсов, считываю уровень с вывода P6.3, записываю как Vs, во время длинных - как Vr, потом считаю (Vr-Vs)/2 и посылаю на COM. То, что буфере один байт, а число получается двухбайтовым, я знаю smile.gif , посылаю пока младший байт, не в этом суть.
Опять-таки лучше было бы посылать не просто код, а преобразовывать его в символьную строку. Тогда результат можно наблюдать даже в виндусовом гипертерминале. А если напряжение вычислять не в абстрактных попугаях, а, например, в миллиВольтах, то для вычислений не понадобится даже плавающая арифметика и результат измерения будет достаточно точным.
Цитата(Daria @ Jun 8 2008, 23:22) *
В ЧЕМ ПРОБЛЕМА - напряжения на P6.3 только положительные, нужно при преобразовании АЦП получать положительные и отрицательные числа. Формула преобразования АЦП по даташиту - 4095*(Vin - V-)/(V+- V-) Питание - 3,3 В. Опорное напряжение Vref+ = 1.5В. Как мне правильно сконфигурировать АЦП? CONSEQ_1 означает, что V- = 0, V+ = 3.3. Более подходящего варианта не вижу. Но как указать, что ноль переносится в 1,5? Или
каждый раз писать Vr - 4095*1.5/3.3 - извините за глупые вопросы, но вот непонятно 05.gif
А вот здесь мне непонятно. Что за двуполярное напряжение? На вход АЦП можно подавать сигнал, который попадает в диапазон от Vref- до Vref+. Если Vref+ равно 1,5В, то входной сигнал не может быть выше 1,5В. Если же в качестве Vref используется питание, то не выше 3,3В. Вы можете сместить входной сигнал на половину питания или относительно любого другого напряжения, но в любом случае промасштабированный размах входного сигнала должен быть не ниже потенциала AGND и не выше потенциала AVCC. Это принципиальное условие для того, чтобы не вывести кристалл из строя.
А для учета смещения нужно ввести коэффициент в конечную формулу преобразования.
Vin=(VREFmax-VREFmin)/(ADCmax-ADCmin)*x+VREFmin-Vbias, где VREFmax - напряжение VREF+/VeREF+, VREFmin - напряжение VREF-/VeREF-, ADCmax - 4095, ADCmin - 0, x - код полученный от АЦП, Vbias - напряжение смещения относительно которого считается нуль. Если у вас Vbias = 1,5В, VREF+ = 3,3В, а VREF- = 0В, то расчетное напряжения Vin в диапазоне от 0В до 1,5В будет иметь отрицательные значения, а от 1,5В до 3,3В положительные значения. Хотя входное измеряемое напряжение будет все равно положительным относительно AGND.
Цитата(Daria @ Jun 8 2008, 23:22) *
И вообще, если кому-то вдруг не лень будет почитать текст - есть ли здесь ошибки при конфигурировании АЦП или USART?
После уточнения параметров задания с вашей стороны приведу свой вариант программы.
Go to the top of the page
 
+Quote Post
Daria
сообщение Jun 9 2008, 22:00
Сообщение #24


Местный
***

Группа: Участник
Сообщений: 229
Регистрация: 24-02-08
Пользователь №: 35 345



Цитата(АДИКМ @ Jun 10 2008, 01:10) *
Расскажите, что это за флаг и почему число должно быть уникальным? Далее, что Вы измеряете и какой амплитуды у Вас сигнал? С какой позиции выбрано опорное 1.5 В, а не 2.5 или 3.3 ?
Если Вы передаете данные в компьютер, то гораздо проще переложить вычисления на него. Ну или расскажите, что Вы задумали сделать.

Пробовала сначала просто посылать один байт, потом другой. но получалась путаница. Поэтому отправляю байт, означающий конец посылки. С опорным, если честно, не понятно. выбрано потому, что по схеме вроде требуется 1,5 В напряжения для правильного включения усилителя мощности - вот с Vref+ и подается. А что дальше с ним делать не знаю biggrin.gif Темная я, темная smile.gif Что хочу сделать, сейчас расскажу - в ответе rezident Спасибо за участие!

Так. Режим переполнения таймера я пока не разбирала smile.gif Так что сейчас, да еще ночью, если честно не все ясно. Просмотрю внимательно Ваши комментарии утром, спасибо огромное, кстати smile.gif
Чего хочу сделать - вообще когда-нибудь это должно стать программой цифрового компаса biggrin.gif Для правильной работы магнитного датчика необходимо подавать с мк такие импульсы на преобразователь IRF7105, с выводов IRF7105 (транзисторная сборка) импульсы(получаются противоположные по направлению тока) идут на датчик. Короткий импульс приводит датчик в рабочее состояние, вычисляются эти Vs, Vr и по формуле постоянно вычисляется смещение. Это позволяет устранить смещение, вызванное рассогласованием датчика из-за магнитных возмущений. Вроде так 05.gif По крайней мере, так я думаю biggrin.gif Потом на основании этих V=(Vr-Vs)/2, считанных с двух выводов(типа х и у координаты магнитного вектора), будет вычисляться азимут. Ну, т.е., должен получиться компас. Пока просто с одним датчиком, потом надо будет подключать акселерометр для измерения кренов. Вычисления желательно делать прямо в мк. штуковина по идее должна выдавать угол и все. Чтобы можно было потом ее везде, где только можно применять без всяких хлопот. Но это все потом, пока вот надо научиться работать с контроллером
Спасибо за участие!

Сообщение отредактировал Daria - Jun 9 2008, 22:11
Go to the top of the page
 
+Quote Post
АДИКМ
сообщение Jun 10 2008, 07:32
Сообщение #25


Знающий
****

Группа: Свой
Сообщений: 630
Регистрация: 2-08-05
Пользователь №: 7 294



Как зовут магнитный датчик?


--------------------
летаю на пепелаце...
Go to the top of the page
 
+Quote Post
Kurt
сообщение Jun 10 2008, 11:36
Сообщение #26


Участник
*

Группа: Свой
Сообщений: 63
Регистрация: 16-06-04
Из: Россия, Уфа
Пользователь №: 31



Мне нравится с каким упорством девушка двигается к намеченной цели ))
когда-то я делал подобную штуку с магниторезисторами hmc, mems-акселерометрами и msp430.

Если речь идет о датчиках hmc не понятны телодвижения с импульсами. (честно говоря мельком посмотрел, не вникая). У них есть последовательность Set/Reset в процессе которой происходит перемагничивание доменов, в зависимости от реализации схемы, времена управляющих сигналов там порядка десятков мкс и можно обойтись без таймеров. Зачем измерять в процессе перемагничивания непонятно.
Здесь выкладывал несколько примитивных процедур. Может пригодится. Простые примеры работы с АЦП, УАРТ и прочее вы можете посмотреть в TI'шных аппнотах, что-то типа slaa15.
Go to the top of the page
 
+Quote Post
Daria
сообщение Jun 10 2008, 20:19
Сообщение #27


Местный
***

Группа: Участник
Сообщений: 229
Регистрация: 24-02-08
Пользователь №: 35 345



smile.gif
Цитата(Kurt @ Jun 10 2008, 15:36) *
Мне нравится с каким упорством девушка двигается к намеченной цели ))

С упорством, достойным лучшего применения? biggrin.gif Есть такое дело. Скоро весь форум на уши подниму со своим компасом biggrin.gif Ну так ведь занятно же. И надо. То то смеху будет, если цель когда-нибудь будет достигнута... smile.gif а это, между прочим, очень даже возможно.

Цитата(Kurt @ Jun 10 2008, 15:36) *
когда-то я делал подобную штуку с магниторезисторами hmc, mems-акселерометрами и msp430.

Да? Это как раз то, что мне нужно. smile.gif Именно hmc1002, mems - акселерометр и msp430. А... у вас случайно... не сохранился проект или его куски?.. biggrin.gif Ну, это так, к слову и совершенно не навязчиво wink.gif
Цитата(Kurt @ Jun 10 2008, 15:36) *
Если речь идет о датчиках hmc не понятны телодвижения с импульсами. (честно говоря мельком посмотрел, не вникая). У них есть последовательность Set/Reset в процессе которой происходит перемагничивание доменов, в зависимости от реализации схемы, времена управляющих сигналов там порядка десятков мкс и можно обойтись без таймеров. Зачем измерять в процессе перемагничивания непонятно.

Мне тоже, если честно, не понятно. Но так написано в даташите. Сначала вычисляется Vs, затем OS = (Vr-Vs)/2, а затем постоянно V= Vr-OS. А вы не делали эти телодвижения? smile.gif И, если не трудно. поясните. как без таймера посылать эти импульсы
Цитата(Kurt @ Jun 10 2008, 15:36) *
Здесь выкладывал несколько примитивных процедур. Может пригодится. Простые примеры работы с АЦП, УАРТ и прочее вы можете посмотреть в TI'шных аппнотах, что-то типа slaa15.

Спасибо. простые примеры читаю. примитивные процедуры постараюсь освоить.
Go to the top of the page
 
+Quote Post
Kurt
сообщение Jun 11 2008, 03:18
Сообщение #28


Участник
*

Группа: Свой
Сообщений: 63
Регистрация: 16-06-04
Из: Россия, Уфа
Пользователь №: 31



Цитата(Daria @ Jun 11 2008, 02:19) *
smile.gif
С упорством, достойным лучшего применения? biggrin.gif Есть такое дело. Скоро весь форум на уши подниму со своим компасом biggrin.gif Ну так ведь занятно же. И надо. То то смеху будет, если цель когда-нибудь будет достигнута... smile.gif а это, между прочим, очень даже возможно.
Да? Это как раз то, что мне нужно. smile.gif Именно hmc1002, mems - акселерометр и msp430. А... у вас случайно... не сохранился проект или его куски?.. biggrin.gif Ну, это так, к слову и совершенно не навязчиво wink.gif

Мне тоже, если честно, не понятно. Но так написано в даташите. Сначала вычисляется Vs, затем OS = (Vr-Vs)/2, а затем постоянно V= Vr-OS. А вы не делали эти телодвижения? smile.gif И, если не трудно. поясните. как без таймера посылать эти импульсы

Спасибо. простые примеры читаю. примитивные процедуры постараюсь освоить.


Совершенно неправильно меня поняли, отсюда сарказм. Я уверен, что Вы непременно добьетесь своей цели с нашей помощью или нет. Отсутствие некоторого опыта с лихвой заменяет здоровый энтузиазм и настойчивость. ))
Я постараюсь Вам помочь, надо пошукать в закромах.
Go to the top of the page
 
+Quote Post
Daria
сообщение Jun 12 2008, 15:35
Сообщение #29


Местный
***

Группа: Участник
Сообщений: 229
Регистрация: 24-02-08
Пользователь №: 35 345



Господа! Как ни странно, оно работает! yeah.gif Ну, в какой-то степени. То есть, координату я считываю, похоже, правильно - загрузилась и поворачивала плату в соответствии со стрелкой обычного компаса, так вот - когда ось датчика параллельна оси компаса, х-вая координата достигает максимального уровня, а, когда ось перпендикулярна стрелке - то уровень напряжения соответствует нулевому. Ну и с другой координатой тоже получается smile.gif Шум только сильный, надо фильтровать. Простое усреднение не поможет? например, брать по 10 отсчетов и усреднять?
И вот теперь такая проблема -
int calculation (x,y,x0,y0,kx0,ky0)
{ (float)((x-x0)*ky0);

return (int) (270 + atan((x-x0)*ky0/(y-y0)*kx0)*180/3,14);

}
void main(void)
{ const int Ox = 2030, Oy = 1810;
const float Kx = 1.3, Ky = 1.3;

int i, Vs[2], Vr[2], offset[2], Vx, Vy, azimut ;
...
и потом

ADC12CTL0 |= ADC12SC + ENC;
Vr[0] = ADC12MEM3;
Vr[1] = ADC12MEM4;
ADC12CTL0 &= ENC;

offset[0] = abs(Vs[0] - Vr[0])/2;
offset[1] = abs(Vs[1] - Vr[1])/2;
Vx=Vr[0]-offset[0];
Vy =Vr[1]-offset[1];
azimut = calculation (Vx,Vy,Ox,Oy,Kx,Ky);
send_int(azimut);

так хочу посчитать угол, вводя пока только ориентировочные калибровочные константы.

Проблема - отношение координат под арктангенсом получается или 0 или 1. Числа int, но ведь вроде так делается переопределение?
Даже вот безотносительно всех этих формул - просто переопределяю int x как float, делю на int y, потом обратно return (int)(x/y), так как пока хочу работать с целыми, и принимающая программка сделана под них. Но отношение получается либо 0, либо 1.
Я понимаю, что вопрос, наверное, очень тупой, но не смейтесь, пожалуйста, просветите. Работаю в IAR.

Что касается ответов - rezident, большое спасибо. с опорным напряжением, кажется, разобралась smile.gif Что касается операций + и "или", спасибо, учту. но вот про таймер все же не совсем ясно. Управляющим можно сделать и вывод P1.2, без проблем, но не понятно пока, как использовать выход таймера, ведь 1 должна посылаться все 918 прерываний. Вы, кстати, обещали написать, как бы Вы это сделали. Работает-то оно, вроде работает, но ведь можно, конечно, гораздо лучше сделать, я-то пока чайник из чайников smile.gif Так что будете в наших краях, заглядывайте, жду smile.gif
Kurt, спасибо большое, Ваше письмо получила, обязательно в скором времени зайду, вот только с интернетом пока проблемы, и с реальным временем тоже 05.gif На работе его нет 05.gif
Вот. Такие вопросы, ответьте, кто-нибудь и не смейтесь smile.gif
Go to the top of the page
 
+Quote Post
rezident
сообщение Jun 12 2008, 19:18
Сообщение #30


Гуру
******

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



Да я не забыл про обещание. Просто пока нет времени, чтобы еще раз осмыслить задачу и написать работающую программу, а не какую-нибудь глюкавую "отписку"-заготовку. Пока лишь временами заглядываю что тут в форуме происходит.
Вам же я посоветую обратить внимание на два момента.
1. если вы хотите задействовать аппаратные возможности таймера по формированию импульсов, то сразу же используйте и аппаратную возможность синхронизации запуска АЦП. Обратите внимание, что вместо того, чтобы программно "дергать" битом ASC12SC можно аппаратно управлять запуском преобразования от сигналов TA1 или TB0, TB1. Т.е. как я и предлагал ранее - формировать времянку с помощью выходного сигнала TA1 и им же управлять запуском АЦП. Конечно же придется разобраться с различными режимами работы выходного модуля таймера, но там все просто. Возможно с точки зрения синхронности работы с АЦП было бы лучше запустить таймер в режиме Count Up с формированием 400мкс интервалов. И уже из этих 400мкс интервалов формировать минутные, переключая лишь режим работы Output Unit TimerA - RESET, SET, SET/RESET.
2. Насчет шумов АЦП и осреднения. Время сэмплирования и преобразования нужно выбирать, исходя в т.ч. из соображений сопротивления источника сигнала. Вы не слишком ли малое время сэмплирования выбрали? Поскольку у вас количество каналов измерения значительно меньше, чем количество каналов АЦП, то усреднение можно сделать полуаппаратно. Запускаете АЦП в режиме последовательности каналов которые сконфигурированы на один и тот же вход АЦП. А затем простым вычислением среднего арифметического значения нескольких значений ADC12MEMx усредняете. Чтобы не нужно было формировать импульс запуска на каждый канал используйте возможности аппаратуры, установив бит MSC в ADC12CTL0 и используя собственный генератор Sample-and-Hold АЦП.
Go to the top of the page
 
+Quote Post

4 страниц V  < 1 2 3 4 >
Closed TopicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


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


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