|
MSP430 - вопросы от чайника, генератор опорного напряжения |
|
|
|
 |
Ответов
|
Jun 6 2008, 20:45
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
При использовании высокочастотного кварца нужна определенная последовательность действий в процедуре инициализации модуля тактирования. По старту тактирование MCLK и SMCLK от DCO происходит. Нужно дождаться стабилизации колебаний кварцевого генератора и только потом переключить тактирование на него. Код BCSCTL2=SELM_0|DIVM_0|DIVS_0; BCSCTL1=DIVA_3|XTS|XT2OFF; do { IFG1&=~OFIFG; } while((IFG1&OFIFG)!=0); BCSCTL2|=SELM_3; После такой процедуры ACLK=XT1/8=1МГц, SMCLK=DCO≈1МГц, MCLK=XT1=8МГц. Кстати, ошибка из-за которой ваш UART принимает неправильно может быть локализована именно здесь. Далее. Как именно вы меняете период TimerA при ваших наблюдениях? Изменяете значение TACCR0 в программе, компилируете, загружаете в кристалл и смотрите? Или это опять где-то в недрах вашей таинственной программы делается? Если первый вариант, но никаких чудес быть не должно. Код TACTL=TASSEL_1|ID_0|TACLR; //TACLK=ACLK/1=1МГц TACCTL0=CCIE; TACCR0=4999; //период перезагрузки (4999+1)/1МГц=5мс TACTL|=MC_1; //только сейчас можно запускать таймер Сначала инициализируем все нужные регистры и только потом запускаем таймер. Период перезагрузки таймера и соответственно вызова прерываний по вектору TIMERA0_VECTOR будет 5мс, а период переключения выхода P1.0 соотвественно вдвое больше. Это если использовать указанный в вашем примере способ "ногодрыгания". Код #pragma vector=TIMERA0_VECTOR #pragma type_attribute=__interrupt void TimerA_ISR (void) { P1OUT^=0x01; }
|
|
|
|
|
Jun 8 2008, 17:22
|
Местный
  
Группа: Участник
Сообщений: 229
Регистрация: 24-02-08
Пользователь №: 35 345

|
Здравствуйте, снова я  Опять проблемы привожу весь свой маленький текст, чтобы не ругались потом. будто что-то скрываю #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. То, что буфере один байт, а число получается двухбайтовым, я знаю  , посылаю пока младший байт, не в этом суть. В ЧЕМ ПРОБЛЕМА - напряжения на 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 - извините за глупые вопросы, но вот непонятно И вообще, если кому-то вдруг не лень будет почитать текст - есть ли здесь ошибки при конфигурировании АЦП или USART? Заранее огромное спасибо
|
|
|
|
|
Jun 9 2008, 21:21
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(Daria @ Jun 8 2008, 23:22)  Здравствуйте, снова я  Опять проблемы привожу весь свой маленький текст, чтобы не ругались потом. будто что-то скрываю  Текст программы пока комментировать не буду, лучше после уточнений приведу для сравнения свой вариант. Сделаю лишь несколько замечаний. 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. То, что буфере один байт, а число получается двухбайтовым, я знаю  , посылаю пока младший байт, не в этом суть. Опять-таки лучше было бы посылать не просто код, а преобразовывать его в символьную строку. Тогда результат можно наблюдать даже в виндусовом гипертерминале. А если напряжение вычислять не в абстрактных попугаях, а, например, в миллиВольтах, то для вычислений не понадобится даже плавающая арифметика и результат измерения будет достаточно точным. Цитата(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 - извините за глупые вопросы, но вот непонятно  А вот здесь мне непонятно. Что за двуполярное напряжение? На вход АЦП можно подавать сигнал, который попадает в диапазон от 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? После уточнения параметров задания с вашей стороны приведу свой вариант программы.
|
|
|
|
Сообщений в этой теме
Daria MSP430 - вопросы от чайника May 18 2008, 20:05 rezident Цитата(Daria @ May 19 2008, 02:05) Подска... May 18 2008, 20:19 Daria Большое спасибо, вопрос был именно про LFXT А в ... May 19 2008, 17:28  rezident Цитата(Daria @ May 19 2008, 23:28) А в ру... May 19 2008, 18:13   Daria Цитата(rezident @ May 19 2008, 21:13) Ну ... May 22 2008, 20:12    Daria А вот еще вопрос от чайника. Подскажите, если кто ... May 25 2008, 19:27 rezident Вам нужен готовый или схема для самостоятельного и... May 25 2008, 19:58 Daria Цитата(rezident @ May 25 2008, 22:58) Вам... May 26 2008, 08:42  Daria Здравствуйте. Такой вопрос - запускаю таймер( в TA... Jun 3 2008, 19:24 rezident Что-то полная путаница. При чем тут модуль TimerA,... Jun 3 2008, 22:07 A R T Цитата(Daria @ Jun 3 2008, 23:24) Здравст... Jun 4 2008, 04:38 Daria Спасибо, следуя вашему совету, начинаю разбираться... Jun 5 2008, 19:51 rezident А у вас высокочастотный кварц 8Мгц куда подключен?... Jun 6 2008, 01:08 Daria Цитата(rezident @ Jun 6 2008, 04:08) А у ... Jun 6 2008, 20:02   Daria на строчку send_int не обращайте внимания, она ост... Jun 8 2008, 18:50    Daria Нет, тут опять ошибки Vs вычисляется после P1OUT... Jun 9 2008, 19:52 АДИКМ Посылать по 6 бит никто не запрещает конечно, но в... Jun 9 2008, 20:24 Daria Цитата(АДИКМ @ Jun 10 2008, 00:24) Посыла... Jun 9 2008, 20:47  АДИКМ Цитата(Daria @ Jun 9 2008, 23:47) Проблем... Jun 9 2008, 21:10   Daria Цитата(АДИКМ @ Jun 10 2008, 01:10) Расска... Jun 9 2008, 22:00 АДИКМ Как зовут магнитный датчик? Jun 10 2008, 07:32 Kurt Мне нравится с каким упорством девушка двигается к... Jun 10 2008, 11:36 Daria Цитата(Kurt @ Jun 10 2008, 15:36) Мне нра... Jun 10 2008, 20:19  Kurt Цитата(Daria @ Jun 11 2008, 02:19)
С уп... Jun 11 2008, 03:18   Daria Господа! Как ни странно, оно работает! ... Jun 12 2008, 15:35 rezident Да я не забыл про обещание. Просто пока нет времен... Jun 12 2008, 19:18 Daria Цитата(rezident @ Jun 12 2008, 23:18) 1. ... Jun 14 2008, 21:39  Dog Pawlowa Цитата(Daria @ Jun 15 2008, 00:39) Помоги... Jun 15 2008, 09:37  rezident Цитата(Daria @ Jun 15 2008, 03:39) Помоги... Jun 15 2008, 20:37   Daria Большое спасибо, rezident, теперь все получилось)) Jun 16 2008, 20:24 rezident Я рад вашим успехам
Кстати, если вам требуется ок... Jun 16 2008, 20:30 Daria Цитата(rezident @ Jun 17 2008, 00:30) Я р... Jun 17 2008, 19:48  rezident Цитата(Daria @ Jun 18 2008, 01:48) Зря ир... Jun 18 2008, 16:28   Daria Здравствуйте, и снова вопросы много, много вопрос... Jun 22 2008, 15:37    rezident Цитата(Daria @ Jun 22 2008, 21:37) ну, ил... Jun 22 2008, 18:38     Daria Здравствуйте снова.
Rezident, спасибо за подробный... Jun 24 2008, 19:17 VAI Цитатаприбавлять число 0.5f.
если число положитель... Jun 17 2008, 03:32 rezident Daria, давайте все исходники (весь проект). Вариан... Jun 24 2008, 20:13 Daria Цитата(rezident @ Jun 25 2008, 00:13) Я б... Jun 25 2008, 18:18  NoName Цитата(Daria @ Jun 25 2008, 21:18) Функци... Jun 26 2008, 14:11   Daria Цитата(NoName @ Jun 26 2008, 18:11) Имеет... Jun 26 2008, 18:44    rezident Цитата(Daria @ Jun 27 2008, 00:44) Спасиб... Jun 26 2008, 20:30     Daria Цитата(rezident @ Jun 27 2008, 00:30) 5 а... Jun 28 2008, 20:14    NoName Цитата(Daria @ Jun 26 2008, 21:44) Спасиб... Jun 29 2008, 11:23     Daria Цитата(NoName @ Jun 29 2008, 15:23) Daria... Jun 29 2008, 21:10    Dog Pawlowa Цитата(Daria @ Jun 26 2008, 21:44) Спасиб... Jun 30 2008, 06:50     Daria Цитата(Dog Pawlowa @ Jun 30 2008, 10:50) ... Jun 30 2008, 16:58      Т.Достоевский Цитата(Daria @ Jun 30 2008, 20:58) ...Как... Jul 1 2008, 00:33       Daria Ау, rezident! Вы там вроде обещали... забыли и... Jul 3 2008, 18:16        Daria Снова я, здравствуйте
Такой вопрос - контроллер... Jul 15 2008, 19:37         NoName Цитата(Daria @ Jul 15 2008, 22:37) Снова ... Jul 16 2008, 09:33          Daria Цитата(NoName @ Jul 16 2008, 13:33) вопро... Jul 16 2008, 18:31
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|