Перейти к содержанию
    

MSP430F135. Осциллятор с цифровым управлением (DCO)

Нужно затактировать Таймер А от 200Гц. SMCLK тактируется от DCO, не знаю как нужную частоту получить (200Гц).

void InitializationTimersMSP430 (void)                                          // Функция инициализации внутренних аппаратных таймеров микроконтроллера MSP430F135
     {
       // Общая инициализвция модуля тактирования микроконтроллера 
     
       BCSCTL1 = 0x00;                                                          // Обнуление управляющего регистра BCSCTL1 
       BCSCTL2 = 0x00;                                                          // Обнуление управляющего регистра BCSCTL2
       BCSCTL1 = RSEL0;                                                        // Сопротивление внутреннего резистора -> минимальное    
       BCSCTL2 = SELM_0 |                                                     // Источник тактирования MCLK -> DCO
                 DIVM_3 |                                                            // Делитель MCLK -> 8
                 SELS_0   |                                                           // Источник тактирования SMCLK -> DCO
                 DIVS_3;                                                            // Делитель SMCLK -> 8  
       DCOCTL = DCO0 |                                                        // Частота генератора ->  (??? Гц)
                MOD0 | MOD1 | MOD2 | MOD3 | MOD4;                 // Модулятор тактовой частоты DCO -> МАКСИМУМ
      LPM4;                                                                           // Низкое энергопотребление
     

       // Инициализация таймера А
       TACTL = TASSEL_2 |                                                       // Источник тактирования таймера -> сигнал SMCLK (???МГц)
               ID_3 |                                                                   // Предделитель таймера -> 8  
                MC_1;                                                                  // Режим работы таймера -> счёт вверх до значения TACCR0
             
       TACCR0 = 10000;                                                          // Счёт до значения -> 10000      
       TACCTL0 = CCIE;                                                          // Разрешение прерывания по захвату/сравнению, разрешение запроса прерывания от флага CCIFG
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У таймера А делитель есть только на 2, 4 и 8. Значит ваш SMCLK должен быть 200 Гц, 400 Гц, 800 Гц или 1.6 кГц. Делитель SMCLK имеет такие же варианты, значит DCO надо настроить на частоту 200 Гц, 400 Гц, 800 Гц, 1.6 кГц, 3.2 кГц, 6.4 кГц или 12.8 кГц. DCO можете подстраивать на нужную частоту вручную внешним резистором или автоматически по кварцевому резонатору (AppNote : Controlling the DCO Frequency of the MSP430x11x, SCIENTIFIC INSTRUMENTS USING THE TI MSP430 Tutorial 16c: Accurate Clocks).

P.S. к тому же ваша программа закончится на строчке LPM4; так как прерывания запрещены и мк переходит в режим LPM4 со всеми отключеными источниками тактирования.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня в библиотеке значение LPM4 немного изменено просто, так что всё впорядке)

а мой вопрос немного изменился. мне надо создать ШИМ с частотой 200Гц, что бы можно было менять его скважность. Какой регистр отвечает за скважность ШИМа, я не совсем понимаю работу Таймера при выводе ШИМ сигналов.

BCSCTL1 = 0x00;                                                          // Обнуление управляющего регистра BCSCTL1 
       IFG1 &= ~XT2OFF;                                                         // XT2 = HF XTAL
         int y;                                                                 // Включение XT2
         do
           {
             IFG1 &= ~OFIFG;                                                    // Очистка флага OFIFG
            for (y = 0xFF; y > 0; y--);                                         // Задержка
           }
         while (IFG1 & OFIFG);                                                  // проверка
      
       BCSCTL2 = 0x00;                                                          // Обнуление управляющего регистра BCSCTL2
       DCOCTL = DCO0 | DCO1 | DCO2 |                                            // Частота генератора -> МАКСИМУМ (8000000 Гц)
                MOD0 | MOD1 | MOD2 | MOD3 | MOD4;                               // Модулятор тактовой частоты DCO -> МАКСИМУМ
       BCSCTL1 = RSEL0 | RSEL1 | RSEL2;                                         // Сопротивление внутреннего резистора -> МАКСИМУМ     
       BCSCTL2 = SELM_2 |                                                       // Источник тактирования MCLK -> XT2CLK
                 DIVM_0 |                                                       // Делитель MCLK -> 1
                 SELS   |                                                       // Источник тактирования SMCLK -> XT2CLK
                 DIVS_0;                                                       // Делитель SMCLK -> 1  
       LPM4;                                                                    // Генераторы DCO и LFXT1 отключены 

       // Инициализация таймера А
       TACTL = TASSEL_2 |                                                       // Источник тактирования таймера -> сигнал SMCLK (8МГц)
               ID_0 |                                                           // Предделитель таймера -> 1  
                MC_1;                                                           // Режим работы таймера -> счёт вверх до значения TACCR0
             
       TACCR0 = 40000;                                                          // Счёт до значения -> 40000      
       TACCTL0 = CCIE;                                                          // Разрешение прерывания по захвату/сравнению, разрешение запроса прерывания от флага CCIFG
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

мне надо создать ШИМ с частотой 200Гц, что бы можно было менять его скважность. Какой регистр отвечает за скважность ШИМа

За скважность ШИМа отвечает соотношение CCR0 и CCRx, где CCRx - защелка, с которой снимается ШИМ.

CCR0 задает период импульсов (в режиме "вверх"), CCRx - длительность импульса.

В зависимости от режима выхода OUT (сброс/установка или установка/сброс) импульсы будут положительные или отрицательные.

 

В вашем случае нужно инициализировать TACCR1 (например) значением длительности импульса (относительно CCR0 = 40000)

То есть CCR1 = CCR0 * PWM_value

Плюс TACCTL1 = OUTMOD7; (конфигурация выхода, режим сброс/установка)

 

ШИМ будет на ноге TA1 (альтернативная функция)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А правильно ли написанна программа, чтобы изменять скважность ШИМа отправляя число по UART через гипертерминал от ПК к MSP430? Не знаю, как основной код программы написать, который под комментарием // Передача данных по UART.

 

int main( void )
  {
    WDTCTL = WDTPW + WDTHOLD;                                                   // Stop watchdog timer to prevent time out reset
    _DINT();                                                                    // Запрещаем прерывания
    InitializationPortIO ();                                                    // Вызов функции инициализации портов ввода/вывода микроконтроллера 
    InitializationTimersMSP430 ();                                              // Вызов функции инициализации внутренних аппаратных таймеров микроконтроллера MSP430F135 
    InitializationUSART ();                                                     // Вызов функции инициализации модуля USART
    _EINT();                                                                    // Разрещаем прерывания

    while (1)
          {                                                                     // Передача данных по UART

if (Flag_1s == true)
               {
                 Transmit_UART_Debug_Info ();  
                }
     Flag_1s = false;
           }
//********************************************************************************
*********************************************************************************
******************************
void InitializationTimersMSP430 (void)                                          // Функция инициализации внутренних аппаратных таймеров микроконтроллера MSP430F135
     {
       // Общая инициализвция модуля тактирования микроконтроллера 
       BCSCTL1 = 0x00;                                                          // Обнуление управляющего регистра BCSCTL1 
       IFG1 &= ~XT2OFF;                                                         // XT2 = HF XTAL
         int y;                                                                 // Включение XT2
         do
           {
             IFG1 &= ~OFIFG;                                                    // Очистка флага OFIFG
            for (y = 0xFF; y > 0; y--);                                         // Задержка
           }
         while (IFG1 & OFIFG);                                                  // проверка
      
       BCSCTL2 = 0x00;                                                          // Обнуление управляющего регистра BCSCTL2
       DCOCTL = DCO0 | DCO1 | DCO2 |                                            // Частота генератора -> МАКСИМУМ (8000000 Гц)
                MOD0 | MOD1 | MOD2 | MOD3 | MOD4;                               // Модулятор тактовой частоты DCO -> МАКСИМУМ
       BCSCTL1 = RSEL0 | RSEL1 | RSEL2;                                         // Сопротивление внутреннего резистора -> МАКСИМУМ     
       BCSCTL2 = SELM_2 |                                                       // Источник тактирования MCLK -> XT2CLK
                 DIVM_0 |                                                       // Делитель MCLK -> 1
                 SELS   |                                                       // Источник тактирования SMCLK -> XT2CLK
                 DIVS_0;                                                       // Делитель SMCLK -> 1  
       LPM4;                                                                    // Генераторы DCO и LFXT1 отключены 

       // Инициализация таймера А
       TACTL = TASSEL_2 |                                                       // Источник тактирования таймера -> сигнал SMCLK (8МГц)
               ID_0 |                                                           // Предделитель таймера -> 1  
                MC_1;                                                           // Режим работы таймера -> счёт вверх до значения TACCR0
             
       TACCR0 = 40000;                                                          // Счёт до значения -> 40000      
       TACCTL0 = CCIE;                                                          // Разрешение прерывания по захвату/сравнению, разрешение запроса прерывания от флага CCIFG
       CCR1 = CCR0 * PWM_value;                                                       // Скважность ШИМа
       TACCTL1 = OUTMOD_7;                                                      // Конфигурация выхода, режим сброс/установка
}


//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
void InitializationPortIO (void)                                                // Функция инициализации портов ввода вывода микроконтроллера 
     {
       
       // Инициализация порта ввода/вывода №3
       P3SEL |= BIT4 | BIT5;                                                    // Выводы 4 и 5 порта 3 настроены как выводы альтернативных функций (USART) 
       P3DIR |= BIT4;                                                           // Вывод 4 порта 3 настраиваем как выход - TXD
       P3DIR &= ~BIT5;                                                          // Вывод 5 порта 3 настраиваем как вход - RXD0
       
       // Инициализация порта ввода/вывода №4
       P4SEL = 0x00;                                                            // Все выводы порта настроены как цыфровые линии 
       P4OUT = 0x00;                                                            // На всех выводах порта установлены логические "0"
       P4DIR = 0xFF;                                                            // Все выводы порта настроены как выходы

       
       // Инициализация порта ввода/вывода №6
       P6SEL |= BIT0 | BIT1 | BIT2;                                             // Выводы 0, 1 и 2 порта 6 настроены как выводы альтернативных функций (ADC) 
//       P6SEL = 0x07; 
       P6DIR &= ~BIT0;                                                          // Вывод 0 порта 6 настраиваем как вход - канал ADC0
       P6DIR &= ~BIT1;                                                          // Вывод 1 порта 6 настраиваем как вход - канал ADC1
       P6DIR &= ~BIT2;                                                          // Вывод 2 порта 6 настраиваем как вход - канал ADC2
//       P6DIR = 0xF8;
       P6OUT = 0x00;
       
     }

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
void InitializationUSART (void)                                                 // Функция инициализации модуля USART микроконтроллера
     {
       // Инициализации модуля USART0        
       UTCTL0 = SSEL1 | SSEL0;                                                  // Источник тактирования таймера -> сигнал SMCLK
       UCTL_0 = CHAR;                                                           // Количество бит во фрейме -> 8
       UBR00 = 0x45;                                                            // Установка коэффициента предделителя USART для скорости приёма/передачи = 115200 при тактовой частоте 8000000 МГц
       UBR10 = 0x00;                                                            // ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
||||||||||||||||||||||||||||||||||||||||||
       UMCTL0 = 0xBA;                                                           // Установка коэффициента модулятора USART для скорости приёма/передачи = 115200 при тактовой частоте 8000000 МГц
       ME1 = UTXE0 |                                                            // Включаем передатчик UART
             URXE0;                                                             // Включаем приёмник UART
       IE1 |= URXIE0;                                                           // Enable USART0 RX interrupt
//      U1CTL &= ~SWRST;                                                       //reset UART logic
     }  

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
void UART_putChar (char c)                                                     // UART1 Transmit Subroutine. Send ony byte via UART. @param c Character to send.
      {
        while ((IFG1 & UTXIFG0) == 0);                                          // Wait for ready U1TXBUF
        U0TXBUF = c;                                                            // send data
      }

//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
void UART_write (const char *buf, int length)                                   // Write string buffer to UART. @param buf String buffer to send. @param length Length of string buffer.
     {
       int i;
       for (i = 0; i < length; i++)
           {
             UART_putChar (buf[i]);
           }
     }

//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Или напишите кто-нибудь пример простой программы, как переслать 1 символ по UARTу, с инициализацией USART и функциями, которые используются

 

Или напишите кто-нибудь пример простой программы, как переслать 1 символ по UARTу, с инициализацией USART и функциями, которые используются

 

Или напишите кто-нибудь пример простой программы, как переслать 1 символ по UARTу, с инициализацией USART и функциями, которые используются

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Примеры кода и работы с периферией лучше искать на страничке производителя http://www.ti.com/product/msp430f135 Ищите то, что называется Code Examples

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Примеры кода на асемблере написанны. А может кто-нибудь простой код на си отправить, как один символ из гипертерминала по UARTу в контроллер MSP430F135 перенести? А то я в UARTе ничего не понимаю

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...