Пытаясь подключить LCD OSD070TN84 к ICnova-AP7000-Base столкнулся со следующей проблемой: выход LCD_CC процессора AP7000 формирует PWM сигнал управления яркостью дисплея с опорной частотой ~ 68 kHz, а для дисплея требуется частота PWM от 100 до 300 Hz. Не долго думая применил ATtiny13 в качестве конвертера.
На входе имеем сигналы LCD_CC — управление яркостью и LCD_PWR выключение подсветки.
Подключение:
| ATtiny13 | |
| ICnova_LCD_CC | PB2 |
| ICnova_LCD_PWR | PB4 |
| LCD_PWM | PB0 |
| MOSFET | PB3 |
#include <avr/interrupt.h>
SIGNAL(TIM0_OVF_vect){
}
int main(void)
{
unsigned int iTemp;
unsigned char iCount;
// Set ADMUX Channel
ADMUX=0x01;
// Initial the ADC Circuit
ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1);
// Disable digital input on ADC1
DIDR0 = 0x02;
DDRB = (1<<PB0)|(1<<PB1)|(1<<PB3); // оба выхода ШИМ
// timer setup
TCCR0A = 0b10110011; // Fast-PWM, выходы А и В в противофазе
TCCR0B = 0b00000011; // без делителm 1024
// настройка прерываний
TIMSK0 = (1<<TOIE0); // по переполнению таймера
asm volatile("sei"::);//Enable interrupts
for(;;)
{
// Start conversion by setting ADSC on ADCSRA Register
ADCSRA |= (1<<ADSC);
// wait until convertion complete ADSC=0 -> Complete
while (ADCSRA & (1<<ADSC));
// Get First ADC Result
iTemp = ADCW;
// Start conversion by setting ADSC on ADCSRA Register
ADCSRA |= (1<<ADSC);
// wait until convertion complete ADSC=0 -> Complete
while (ADCSRA & (1<<ADSC));
// Get Second ADC Result
iTemp += ADCW;
// Start conversion by setting ADSC on ADCSRA Register
ADCSRA |= (1<<ADSC);
// wait until convertion complete ADSC=0 -> Complete
while (ADCSRA & (1<<ADSC));
// Get the Final ADC Result
iTemp += ADCW;
// ADC = (Vin x 1024) / Vref, Vref = 5 Volt
// Calculate the average value for 3 ADC samples result
iTemp = (int)(iTemp/3);
if( iTemp>675) iCount = 255; else iCount=(unsigned char)(iTemp * 100 / 264);
if( (PINB & (1<<PB4))==0 )
{
OCR0A = iCount;
OCR0B = iCount;
PORTB &= ~(1<<PB3);
} else
{
OCR0A = 0;
OCR0B = 0;
PORTB |= (1<<PB3);
}
}
return 0;
}
Краткое пояснение. ATtiny13 сконфигурирована для работы от внутреннего генератора, предделитель для таймера установлен в 1024. При данных параметрах опорная частота PWM составила 280 Hz.
Так как под руками была только ATtiny13 на 5 вольт (на 3.3 работала не стабильно, не всегда стартовала), они же используются как опорные для ADC.
На вход Attyny13 через RC цепочку поступает сигнал LCD_CC, который измеряется ADC в Attiny13 и преобразуется в PWM на выходе PB0. Максимальное входное напряжение на входе равно 3.3 вольта, получаем 1024 / 5 * 3.3 = 675, далее преобразуем его в % где 3.3 вольта это 100% — PWM iCount=(unsigned char)(iTemp * 100 / 264);
Свежие комментарии