Страница 1 из 1

Atmega8 ШИМ OC1A и OC1B в противофазе

Добавлено: Чт май 21, 2015 17:43:00
Viper115
Здравствуйте. Добрался до атмег.
Встал вопрос, на который не могу найти однозначный ответ. К ногам ОС1А и ОС1В подключается пьезоизлучатель. На этих ногах нужно настроить ШИМ с частотой 4 кГц. Но, чтобы добиться максимальной громкости, нужно пустить ШИМ на эти две ноги в противофазе. Можно ли так сделать? Если да, то ткните носом, как. Кодю на асме

Re: Atmega8 ШИМ OC1A и OC1B в противофазе

Добавлено: Чт май 21, 2015 18:32:42
ChipKiller
Viper115 писал(а):...чтобы добиться максимальной громкости, нужно пустить ШИМ на эти две ноги в противофазе
чтобы добиться максимальной громкости,нужен усилитель, а если нужно выжать максимум при ограниченном напряжении - мостовой усилитель. Простой транзистор включенный по схеме с ОЭ создаст желаемую противофазу. Но если хочется получить инверсию на ОС1А и ОС1В - настройте значение битов COMxx в регистре TCCR

Re: Atmega8 ШИМ OC1A и OC1B в противофазе

Добавлено: Чт май 21, 2015 20:47:41
Viper115
.cseg
.org 0
;------------------ Вектора прерываний ---------------------------
rjmp PROG
reti; rjmp SUBI_INT0
reti; rjmp SUBI_INT1
reti ; rjmp SUBI_TIMER2_COMPARE
reti ; rjmp SUBI_TIMER2_OVERFLOW
reti ; rjmp SUBI_TIMER1_INPUT
reti ; rjmp SUBI_TIMER1_COMPARE_A
reti ; rjmp SUBI_TIMER1_COMPARE_B
reti ; rjmp SUBI_TIMER1_OVERFLOW
reti ; rjmp SUBI_TIMER0_OVERFLOW
reti ; rjmp SUBI_SPI
reti ; rjmp SUBI_USART_RECEIVE
reti ; rjmp SUBI_USART_DATA_EMPTY
reti ; rjmp SUBI_USART_TRANSMIT
reti ; rjmp SUBI_ADC
reti ; rjmp SUBI_EEPROM
reti ; rjmp SUBI_COMPARATOR
reti ; rjmp SUBI_TWI
reti ; rjmp SUBI_SPM
;-----------------------------------------------------------------
;Начало программы
PROG:
ldi R16,high(RAMEND)
out SPH,R16
ldi R16,low(RAMEND)
out SPL,R16
cli


ldi r16,(1<<COM1A1)|(1<<COM1B1)|(1<<COM1B0)|(1<<WGM10)|(1<<WGM11)
out TCCR1A,r16
ldi r16,(1<<CS10)|(1<<WGM12)|(1<<WGM13)
out TCCR1B,r16

ldi r16, 128
OUT OCR1AH,r16
OUT OCR1BH,r16

main:
rjmp Main


Что не так?

Re: Atmega8 ШИМ OC1A и OC1B в противофазе

Добавлено: Пт май 22, 2015 06:06:16
Z_h_e
Разбирайтесь

Код: Выделить всё

PROG: 
ldi R16,high(RAMEND) 
out SPH,R16
ldi R16,low(RAMEND)
out SPL,R16
cli


ldi r16, 0b00000110
out DDRB,r16
ldi r16, 0b11111101 
out PORTB,r16


ldi r16, 128
OUT OCR1AH,r16
OUT OCR1BH,r16
clr r16
OUT OCR1AL,r16
OUT OCR1BL,r16

ldi r16,(0<<COM1A1)|(1<<COM1A0)|(0<<COM1B1)|(1<<COM1B0)|(1<<WGM10)|(1<<WGM11)
out TCCR1A,r16
ldi r16,(1<<CS10)|(1<<WGM12)|(1<<WGM13)
out TCCR1B,r16



main:
rjmp Main

Re: Atmega8 ШИМ OC1A и OC1B в противофазе

Добавлено: Пт май 22, 2015 06:09:44
akl
Для получения реакции на выходах нужно их сделать таковыми. Регистры таймера 1 16-тиразрядные и для них существует специальная процедура установки. Разберитесь с режимами PWM.
Спойлер

Код: Выделить всё

ldi R16,high(RAMEND)
out SPH,R16
ldi R16,low(RAMEND)
out SPL,R16
cli

	LDI	R16,0b00000110
	OUT	DDRB,R16

	CLR	R15
	ldi r16, 128
	OUT OCR1AH,r15
	OUT OCR1AL,r16

	OUT OCR1BH,r15
	OUT OCR1BL,r16

ldi r16,(1<<COM1A1)|(1<<COM1B1)|(1<<COM1B0)|(1<<WGM10)
;ldi r16,(1<<COM1A1)|(1<<COM1B1)|(1<<COM1B0)|(1<<WGM10)|(1<<WGM11)
out TCCR1A,r16
	ldi r16,(1<<CS10)|(1<<WGM12)
out TCCR1B,r16

;ldi r16, 128
;OUT OCR1AH,r16
;OUT OCR1BH,r16

main:
rjmp Main

Re: Atmega8 ШИМ OC1A и OC1B в противофазе

Добавлено: Пт май 22, 2015 16:41:58
Viper115
Спасибо

Re: Atmega8 ШИМ OC1A и OC1B в противофазе

Добавлено: Пн июн 01, 2015 20:10:58
Igor_67
И где в вашем листинге собственно включено прерывание TIMER1, которое управляет ШИМ-ом?

Re: Atmega8 ШИМ OC1A и OC1B в противофазе

Добавлено: Пн июн 01, 2015 20:18:58
Z_h_e
Для аппаратного ШИМ прерывание не нужно. Оно само ШИМится.

Re: Atmega8 ШИМ OC1A и OC1B в противофазе

Добавлено: Пн июн 01, 2015 20:35:48
Igor_67
Z_h_e писал(а):Для аппаратного ШИМ прерывание не нужно. Оно само ШИМится.
Может я, конечно, и ошибаюсь, но аппаратнай ШИМ есть не во всех МК, это во-первых, а во-вторых - объем кода софтового ШИМа, использующего прерывание TIMER1, пожалуй даже меньше объема кода хардверного ШИМа.

Re: Atmega8 ШИМ OC1A и OC1B в противофазе

Добавлено: Пн июн 01, 2015 20:40:36
Z_h_e
Нет. Он не может быть меньше в принципе. К тому же аппаратный ШИМ не жрет программный ресурс контроллера. Вы его (ШИМ) запустили и он молотит, как собственно любое перифирийное устройство, а программный код занимается своими делами. Например ничем.

Re: Atmega8 ШИМ OC1A и OC1B в противофазе

Добавлено: Пн июн 01, 2015 20:46:22
Igor_67
Ой да ладно... По-Вашему он "молотит" просто так и не расходует такты МК?, Прямо волшебство какое-то...

Re: Atmega8 ШИМ OC1A и OC1B в противофазе

Добавлено: Пн июн 01, 2015 20:51:17
Z_h_e
Это "волшебство" было организовано очень давно. В советское время называлось однокристальные микроЭВМ.

В современных цифровых устройствах, ну пускай обычнsй комп x86, видюхи, звуковухи, усарты работают сами, им проц только говорит что сделать... а хотя чего я объясняю. Код проверьте. ТС понравилось.