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

 
 
> АЦП и Таймер в контроллере MSP430F5438, Не могу кинуть данные в регистр таймера
mzhelezkin
сообщение Feb 1 2010, 14:27
Сообщение #1





Группа: Участник
Сообщений: 14
Регистрация: 15-01-10
Пользователь №: 54 827



Здравствуйте. Подскажите в чем дело. Вот код программы:
CODE
#include "msp430x54x.h"
#include "setup_ustroistva.c"
unsigned char a = 0;
void main(void)
{
WDTCTL = WDTPW+WDTHOLD; // Остановка сторожевого таймера

setup_adc();

setup_tb();

for(;;)
{
ADC12CTL0 |= ADC12SC;
a = ADC12MEM0_L;
TB0CCTL4 = (*((unsigned char*)ADC12MEM0));
}
}


Работаю в IAR Embeddet Workbench v4.20.1. Микроконтроллер MSP430F5438. В функциях setup_adc() и setup_tb() просто настройка АЦП и таймер B. Настроил АЦП на 8 разрядов, соответственно таймер B тоже. Проблема в том, что данные из регистра ADC12MEM0 не могу записать в регистр TB0CCTL4. Пробовал и без указателе, т.е просто
TB0CCTL4 = ADC12MEM0;
Не работает. А в переменную записываеться (выше определена переменная а). Ниже привожу картинку.

Прикрепленное изображение


Вообще мне нужно вывести на наушники голос человека. В качестве ЦАП использую ШИМ. Вот, так сказать и мучаюсь. Новую тему создавать не стал, нашел на этом же форуме обсуждение подобной проблемы. Название темы такое: "ЦАП на ШИМ Atmega, Реализация ЦАП с помощью ШИМ атмеги". Общая идея в принципе понятна. По переполнению таймера счетчика, делаем одну выборку АЦП и кидаем ее сразу в регистр таймера. Но вот закинуть в регистр выборку, что-то не получается.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
rezident
сообщение Feb 2 2010, 20:40
Сообщение #2


Гуру
******

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



Ой-ё-ё! wacko.gif Вынужден констатировать, что вы, mzhelezkin, как минимум слабо разобрались с работой периферийных модулей. Так что читайте MSP430x5xx Family User's Guide до полного просветления. Вам еще повезло, что вы случайно не установили глобальный флаг разрешения прерываний. Иначе вообще бы все рухнуло. laughing.gif
Ну а саму программу следует сначала описать в виде алгоритмов и конечных автоматов. Судя по всему, у вас в голове нет алгоритма, есть только мысль, что оцифровка сигнала заключается в том, чтобы считать слово из АЦП и запихнуть его в какой-то регистр таймера. И при этом все должно автоматически заработать. В этом вы "слегка" ошибаетесь, забывая про "овраги" (гладко было на бумаге, да забыли про овраги).
Во-первых, АЦП не дает результат моментально. Для оцифровки аналогового сигнала требуется определенное время. У вас же в программе считается, что результат готов всегда и моментально. Нужно использовать опрос флага готовности результата АЦП перед тем как его (результат оцифровки) считывать.
Во-вторых, параметры ШИМ нельзя менять в произвольное время, а только по окончании текущего импульса ШИМ. Иначе будет то, что у вас и получается - свист, писк, треск и потусторонние голоса. Для этого в MSP430 существует специально разработанная аппаратура таймера. Изучите ее работу.
В-третьих, нужно обеспечить синхронизацию оцифровки звука и вывода звука, чтобы частота сэмплирования на входе и выходе была одинаковой. В связи с этой проблемой нужно правильно настроить систему тактирования микроконтроллера, чем вы вообще не озаботились. Про теорему Котельникова (Котельникова-Найквиста-Шеннона) что-нибудь слышали? Если нет, то поГуглите. Обязательно!
Про формирование сигналов с помощью таймера, генерирующего сигнал ШИМ, в MSP430 почитайте Using PWM Timer_B as a DAC. Вот в этой книге есть его вариант перевода на русский. Там же, кстати, и про архитектуру MSP430 кое-что разжевано.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 1st July 2025 - 09:53
Рейтинг@Mail.ru


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