После выхода из строя силовой части осталась плата с цифровой частью от реле напряжения "Страж". Хочу применить её в качестве вольтметра постоянного напряжения с пределом 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;
|