Миландр

Ключевым подразделением нашей компании является Центр Проектирования интегральных микросхем
Текущее время: 2018-окт-16 17:18

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
СообщениеДобавлено: 2017-ноя-20 12:16 
Не в сети

Зарегистрирован: 2011-май-26 11:28
Сообщения: 3
Имеется такой код (используется uOS) для настройки первого канала таймера 3 как ШИМ с использованием DTG для получения требуемого смещения по прямому и инверсному каналам

Код:
   ///--- настройка таймера, как простой счетчик
   ARM_TIMER3->TIM_CNTRL = 0x00000000;
   // --- начальное значение счетчика
   ARM_TIMER3->TIM_CNT =   0x00000000;
   // --- предделитель частоты (1 тик = 1 кГц)
   ARM_TIMER3->TIM_PSG =   KHZ/1000-1;
   // --- основание счета
   ARM_TIMER3->TIM_ARR = 50;
   // --- разрешение прерывания по переднему фронту только для канала 1
   ARM_TIMER3->TIM_IE = 0x00000022;
   // --- первый канал счетчика - ШИМ
   ARM_TIMER3->TIM_CH1_CNTRL = 0x00000C30;    // выработка сигнала REF по принципу:
                                  // 1 всегда кроме CNT>CCR и CNT<CCR1 - в этом случае 0
   // --- на выход работают оба канала
   // --- сигнал на двух каналах идет через ДТГ
   // --- оба канала инвертируем
   ARM_TIMER3->TIM_CH1_CNTRL1 = 0x00001D1D;
   // --- настройка делителя DTG
   ARM_TIMER3->TIM_CH1_DTG = 0x00000610;
   ARM_TIMER3->TIM_CH1_CNTRL2 = 0x00000004;   // разрешение работы регистра CCR1
   // --- настройка регистров ССR, CCR1
   ARM_TIMER3->TIM_CCR1 = 25;
   ARM_TIMER3->TIM_CCR11 = 50;
   // --- разрешение работы таймера.
   // --- частота сэмплирования данных FDTS - каждый четвертый TIM_CLK
   ARM_TIMER3->TIM_CNTRL = 0x00000031;


Однако, при выполнении измерений осциллографом, формируются равные меандры по 25 мкс. (как будто DTG не используется). В чем может быть проблема? Может быть не учтена какая-то настройка таймера?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2017-дек-30 01:07 
Не в сети
Аватара пользователя

Зарегистрирован: 2013-июн-21 15:27
Сообщения: 91
Откуда: Новосибирск
если расписать значения регистров по полям, получается следующее:

Код:
TIMER3->TIM_IE = TIMER_IE_CNT_ARR_EVENT_IE            // прерывание при CNT==ARR
               | (1 << TIMER_IE_CCR_CAP_EVENT_IE_Pos);// прерывание при захвате CCR в канале 1 (нет в режиме ШИМ !)
TIMER3->TIM_CH1_CNTRL = TIMER_CH_MODE_PWM               // режим ШИМ
                      | TIMER_CH_REF_Format6            // REF=1 при CCR1<CNT<CCR (должно быть CCR1<CCR ?)
                      | (TIMER_CH_Prescaler_None << TIMER_CH_CNTRL_CHPSC_Pos) // без предв.деления вх.сигнала
                      | TIMER_CH_EvSrc_PE_OC2           // событие в канале 1 по полож.фронту в канале 3 (?)
                      | TIMER_Filter_5FF_at_FTDS_div_32;// сигнал зафиксирован в 5 триггерах на частоте FDTS/32
TIMER3->TIM_CH1_CNTRL1 = TIMER_CH_CNTRL1_NINV                                    // инв.выход деинвертируется
                       | (TIMER_CH_OutSrc_DTG << TIMER_CH_CNTRL1_NSELO_Pos)      // на инв.выход выдается DTG
                       | (TIMER_CH_OutMode_Output << TIMER_CH_CNTRL1_NSELOE_Pos) // всегда работает на выход
                       | TIMER_CH_CNTRL1_INV                                     // прям.выход инвертируется
                       | (TIMER_CH_OutSrc_DTG << TIMER_CH_CNTRL1_SELO_Pos)       // на прям.выход выдается DTG
                       | (TIMER_CH_OutMode_Output << TIMER_CH_CNTRL1_SELOE_Pos); // всегда работает на выход
TIMER3->TIM_CH1_CNTRL2 = TIMER_CH_CNTRL2_CCR1_EN;// использовать CCR1
TIMER3->TIM_CH1_DTG = (6 << TIMER_CH_DTG_Pos)  // основной делитель частоты
                    | TIMER_CH_DTG_ClkSrc_FDTS // DTG работает на частоте FDTS
                    | (0 << TIMER_CH_DTGX_Pos);// предварительный делитель частоты
TIMER3->TIM_CCR1  = 25;
TIMER3->TIM_CCR11 = 50;
TIMER3->TIM_CNTRL = TIMER_EvSrc_None           // не считать внеш.события
                  | TIMER_CntMode_ClkFixedDir  // считать внутр.частоту в одну сторону
                  | TIMER_CntDir_Up            // считать вверх
                  | TIMER_FDTS_TIMER_CLK_div_4 // семплировать каждый четвертый TIM_CLK
                  | TIMER_CNTRL_CNT_EN;        // включить таймер


непонятки:
1. зачем разрешать прерывания по Захвату, если режим ШИМ?
2. в спецификации написано, что при разрешённом CCR1 формат 6 означает "REF=1 при CCR1<CNT<CCR", это, вероятно, ошибка, но если нет, то при ваших значениях условие никогда бы не выполнялось
3. в качестве источника событий на входе канала 1 указан положительный фронт на канале 3. Это так и задумано? И зачем вообще события на входе канала 1, если он работает на выход (режим ШИМ), а основной счётчик работает от внутренней частоты TIM_CLK, а не от внешних событий?
4. зачем фильтр на входе канала, работающий на частоте FDTS/32 = TIM_CLK/128, если канал работает на выход, а основание счёта 50? Может быть имелось ввиду что-то другое?
5. задержка DTG задана FDTS/6 = TIM_CLK/24 при полупериоде 25. Так и задумано?

_________________
Странник


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB