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

 
 
> MSP430 - вопросы от чайника, генератор опорного напряжения
Daria
сообщение May 18 2008, 20:05
Сообщение #1


Местный
***

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



Здравствуйте.
Подскажите пожалуйста, генератор тактовой частоты запускается сразу после подачи питания или его надо сначала сконфигурировать? не могу найти регистр, который бы за это отвечал. Тот же вопрос про генератор опорного напряжения.
Подскажите еще, пожалуйста, как в CCE 2.0 войти в режим симулятора, никак не могу понять. Вроде в свойствах проекта на режим отладки устанавливаю - "simulator", но при запуске debuge ничего не происходит.
Go to the top of the page
 
+Quote Post
4 страниц V  < 1 2 3 4 >  
Start new topic
Ответов (15 - 29)
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 Текстовая версия Сейчас: 28th August 2025 - 06:04
Рейтинг@Mail.ru


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