После выхода из строя силовой части осталась плата с цифровой частью от реле напряжения "Страж". Хочу применить её в качестве вольтметра постоянного напряжения с пределом 0-20В (для автомобиля), но в программировании (написании прошивки), мягко говоря, я не очень силен. Поэтому надеюсь на помощь форумчан в написании кода на Си для CVAVR.
Итак, что имеется на плате:
1. трехразрядный семисегментный индикатор с ОК;
2. мк attiny26;
3. две кнопки без фиксации;
4. три сопротивления.
Т.к. это всё уже запаяно на плате, то хотелось бы всё так и оставить без переделок и подгонять проект под эту плату.
Мои мысли-замечания по поводу платы (я могу и ошибаться):
1. т.к. сопротивления всего 3, то использовалась не поразрядная, а посегментная индикация;
2. вывода vcc и avcc соединены напрямую проводником на печатной плате, вывод aref подключен к индикатору - поэтому в качестве опорного напряжения используется vcc;
3. сигнал с делителя поступает на 7-й пин мк (РВ4, ADC7).
Основные требования к вольтметру: приемлемая точность показаний и индикация напряжения с десятками вольт (т.е. 13,9 или 14,1 и т.п.). В идеале - коррекция измерения (АЦП) двумя кнопками в + и в -.
В архиве выкладываю схему РН "Страж" и предполагаемую схему вольтметра.
Вот такой код пока набросал (начальные настройки, дальше темный лес):
PHP код:
|
Chip type : ATtiny26 AVR Core Clock frequency: 8,000000 MHz Memory model : Tiny External RAM size : 0 Data Stack size : 32 ************************************************** ***/ #include ‹tiny26.h›
#include ‹delay.h›
#define digit3 PORTB.6 //катод 3-й цифры #define digit2 PORTB.0 //катод 2-й цифры #define digit1 PORTB.1 //катод 1-й цифры
#define ADC_AVERAGE (50) //среднее по 50-ти замерам char digit_out[3], cur_dig; //переменные для работы с LED
unsigned long indication; //переменная для хранения чисел unsigned int volt;
flash char digits[] = {0xE7, 0x24, 0xAB, 0xAE, 0x6C, 0xCE, 0xCF, 0xA4, 0xEF, 0xEE, 0x00}; //индикатор с ОК
void recoding(void) { //разделение на сотые, десятые и единичные доли digit_out[0]=indication/100%10; digit_out[1]=indication/10%10; digit_out[2]=indication%10; } #define ADC_VREF_TYPE 0x00
// Read the AD conversion result unsigned int read_adc(unsigned char adc_input) { ADMUX=adc_input | (ADC_VREF_TYPE & 0xff); // Delay needed for the stabilization of the ADC input voltage delay_us(10); // Start the AD conversion ADCSR|=0x40; // Wait for the AD conversion to complete while ((ADCSR & 0x10)==0); ADCSR|=0x10; return ADCW; }
void main(void) { // Port A initialization // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 PORTA=0x00; DDRA=0xFF;
// Port B initialization // Func7=In Func6=Out Func5=In Func4=In Func3=In Func2=In Func1=Out Func0=Out // State7=P State6=0 State5=T State4=T State3=P State2=T State1=0 State0=0 PORTB=0x88; DDRB=0x43;
// ADC initialization // ADC Clock frequency: 125,000 kHz // ADC Voltage Reference: AVCC pin ADMUX=ADC_VREF_TYPE & 0xff; ADCSR=0x86;
|