Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » ATxmega сдвиг фазы PWM


ATxmega сдвиг фазы PWM

Сообщений 1 страница 3 из 3

1

МК ATxmega64a3u.
Возникла необходимость в двух шим со сдвигом в 180.
Записал в регистр счетчика Tcf0_cnt значение в два раза меньше чем в регистр периода Tcf0_per.
Генерит как положено - со сдвигом на 180, но до тех пор пока не перейду на вторую подпрограмму.
После возврата, фаза сигнала смещается непредсказуемо.
Подскажите в чем проблема ? 
Хотя склоняюсь , что сам принцип реализации сдвига сигнала не совсем корректен.

Код

$regfile = "xm64a3def.dat"
$crystal = 32000000
$hwstack = 64
$swstack = 64
$framesize = 64                                             '
'-------------------------------------------------------------------------------
$lib "xmega.lib" : $external _xmegafix_clear : $external _xmegafix_rol_r1014
'-------------------------------------------------------------------------------
Config Osc = Enabled , 32mhzosc = Enabled , 32khzosc = Enabled
Config Sysclock = 32mhz , Prescalea = 1 , Prescalebc = 1_1
'-------------------------------------------------------------------------------

Config Tcf0 = Pwm , Prescale = 64

Tcf0_cnt = 5200

Config Tce1 = Pwm , Prescale = 64

'-------------------------------------------------------------------------------
Config Portf.0 = Output
Config Porte.5 = Output

'-------------------------------------------------------------------------------
Config Pinb.6 = Input : Config Pinb.7 = Input
Button_mode Alias Pinb.6 : Button_start_stop Alias Pinb.7
'-------------------------------------------------------------------------------
'Dim Period As Word , Dlitelnost As Word
Dim Status_start_stop As Bit , Rejim As Bit
'===============================================================================
Do
If Rejim = 0 Then
Gosub Rejim_1 : Else : Gosub Rejim_2 : End If

Debounce Button_start_stop , 0 , Start_stop , Sub
Debounce Button_mode , 0 , Mode_select , Sub
Loop
'=========================== КНОПКА СТАРТ / СТОП ===============================
Start_stop:
Toggle Status_start_stop
Return
'=============================== ВЫБОР РЕЖИМА ==================================
Mode_select:
If Status_start_stop = 0 Then Toggle Rejim
Return
'============================== РЕЖИМ_1 ========================================
Rejim_1:

Tcf0_perbuf = 10400
Tcf0_ccabuf = 2400

Tce1_perbuf = 10400
Tce1_ccbbuf = 2400

If Status_start_stop = 0 Then
Tcf0_ctrla = 0 : Tce1_ctrla = 0 : Tcf0_ctrlb = &B00000011 : Tce1_ctrlb = &B00000011 : Portf.0 = 1 : Porte.5 = 0
Else
Tcf0_ctrla = 5 : Tce1_ctrla = 5 : Tcf0_ctrlb = &B00010011 : Tce1_ctrlb = &B00100011
End If

Return

'============================== РЕЖИМ_2 ========================================
Rejim_2:
Tcf0_perbuf = 5400
Tcf0_ccabuf = 1400

Tce1_perbuf = 5400
Tce1_ccbbuf = 1400

If Status_start_stop = 0 Then
Tcf0_ctrla = 0 : Tce1_ctrla = 0 : Tcf0_ctrlb = &B00000011 : Tce1_ctrlb = &B00000011 : Portf.0 = 0 : Porte.5 = 1
Else
Tcf0_ctrla = 5 : Tce1_ctrla = 5 : Tcf0_ctrlb = &B00010011 : Tce1_ctrlb = &B00100011
End If

Return

'===============================================================================

0

2

Разобрался, стоило создать условие If Tce1_cnt = 0 Then Tcf0_cnt = 5200, и все замечательно отрабатывает.
Но столкнулся с очередной проблемой - если в подпрограммах Rejim_1 и Rejim_2 вывести любую информацию на
LCD, то опять начинаются глюки. Пока разбираюсь в чем косяк.

0

3

Скорее всего у вас постоянно будут проблемы, ибо алгоритм построен без прерываний срабатывания таймеров.
Когда вы обращаетесь к ЛСД, то происходит задержка, которой достаточно для пропуска отслеживания состояния таймеров (просто пролетает).

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » ATxmega сдвиг фазы PWM