господа вы правда верите что какаято квадрато мелевичная херня с нощками даже без ИОН???? хернясумет мерить достоверно 230/400VAC в сети? да+ и токовского в придачу??? НЕ ВЕРЮ!
оригинал Спойлер опорное напряжение +5v0 Спойлер ничего не работает... и динамика кривоватая, маленькое времечко экспозиции разряда... в оригинале было по 16...20мс... смотрю в сторону max7219... но там я вообче никаких примеров не нашёл пока
Ну, у вас ведь по току инвертирующий усилитель. По напряжению зачем-то RV3, так-же в странном положении выставлен. Вот и показывает 0. И, да, я с протеусом не знаком. Но, в 1-м посте темы индикаторные вольтметры показывали какие-то значения. А здесь не показывают.
В качестве пятничной развлекухи программа вольтамперметра с разверткой индикации от тактирования АЦП без использования таймера. -встроенная опора 2,56V -каждый параметр оцифровывается 256 раз с суммированием в 3-байтном счетчике; округленный результат в 2-х старших байтах счетчика -далее конвертация для вывода на индикацию с гашением незначащих нулей В железе не проверялось. Возможно, где-то накосячил.
пал ниц перед талантливым нжинеером и он написал заветный код Спойлер#define F_CPU 8000000 //тактовая частота мк #include <avr/io.h> //подключение библиотеки "ввод/вывод" мк #include <util/delay.h> //подключение библиотеки "пауза" мк #include <avr/interrupt.h> //подключение библиотеки "прерывание" мк
#define CLK_0 PORTC &= ~(1<<PORTC0) //отправить 0 на вывод Clk микросхемы MAX7219 #define CLK_1 PORTC |=1<<PORTC0 //отправить 1 на вывод Clk микросхемы MAX7219 #define CS_0 PORTC &= ~(1<<PORTC1) //отправить 0 на вывод Cs микросхемы MAX7219 #define CS_1 PORTC |=1<<PORTC1 //отправить 1 на вывод Cs микросхемы MAX7219 #define DIN_0 PORTC &= ~(1<<PORTC2) //отправить 0 на вывод Din микросхемы MAX7219 #define DIN_1 PORTC |= 1<<PORTC2 //отправить 1 на вывод Din микросхемы MAX7219
unsigned int Cifra[8]; //массив беззнаковых двухбайтных переменных Cifra из 8 переменных unsigned char Data_In[8]; //массив беззнаковых обнобайтных переменных Data_In из 8 переменных unsigned int Displey1_ADC; //беззнаковая двухбайтная переменная Displey1_ADC unsigned int Displey2_ADC; //беззнаковая двухбайтная переменная Displey2_ADC unsigned char X; //беззнаковая однобайтная переменная X (значение регистра ацп с результатом оцифровки напряжения) unsigned char I; //беззнаковая однобайтная переменная I (значение регистра ацп с результатом оцифровки тока)
//********************* Передача данных в Max7219 ***************** void Write_MAX7219(unsigned char Adres_Reg,unsigned char Data_In_Write) { unsigned char Adres_Reg_Copy;
CS_0; //отправим «0» на вывод CS микросхемы MAX7219, чтобы начать процесс передачи адреса и данных asm("nop"); //пауза в 1 такт
for(I=0;I<8;I++) //цикл от 0 до 7 с шагом 1, для побитной отправки байта адреса в микросхему MAX7219 { if((Adres_Reg & 0x80)==0x80) //если 7 бит переменной Adres_reg=1 { DIN_1; //отправим 1 на вывод Din микросхемы MAX7219 } else //если 7 бит переменной Adres_reg=0 { DIN_0; //отправим 0 на вывод Din микросхемы MAX7219 }
//создадим тактовый импульс на выводе CLK микросхемы MAX7219 asm("nop"); //пауза в 1 такт CLK_1; //отправим 1 на вывод Clk микросхемы MAX7219 asm("nop"); //пауза в 1 такт CLK_0; //отправим 0 на вывод Clk микросхемы MAX7219 Adres_Reg <<= 1; //сдвинем значение переменной Adres_reg на 1 бит влево } //выйдем из цикла когда i станет равной 7, т.е. когда отправка байта адреса в микросхему MAX7219 будет окончена
for(I=0;I<8;I++) //цикл от 0 до 7 с шагом 1, для побитной отправки байта данных в микросхему MAX7219 { if((Data_In[Adres_Reg_Copy] & 0x80)==0x80) //если 7 бит переменной Data_in=1 { DIN_1; //отправим 1 на вывод Din микросхемы MAX7219 } else //если 7 бит переменной Data_in=0 { DIN_0; //отправим 0 на вывод Din микросхемы MAX7219 }
//создадим тактовый импульс на выводе CLK микросхемы MAX7219 asm("nop"); //пауза в 1 такт CLK_1; //отправим 1 на вывод Clk микросхемы MAX7219 asm("nop"); //пауза в 1 такт CLK_0; //отправим 0 на вывод Clk микросхемы MAX7219 Data_In[Adres_Reg_Copy] <<= 1; //сдвинем значение переменной Data_in на 1 бит влево } //выйдем из цикла когда i станет равной 7, т.е. когда отправка байта данных в микросхему MAX7219 будет окончена CS_1; //отправим «1» на вывод CS микросхемы MAX7219, чтобы завершить процесс передачи адреса и данных }
//********************* Инициализация MAX7219 ***************** void Inicializat_MAX7219() { Write_MAX7219(0x09,127); //включаем режим BCD code B, для 7 разрядов Write_MAX7219(0x0A,10); //яркость свечения сегментов 10 (от 0 до 15) Write_MAX7219(0x0B,7); //число используемых разрядов (7 разрядов) Write_MAX7219(0x0C,1); //отключаем режим энергосбережения (Shutdown) }
//******** Функция вывода значений на 7 сегм.индикатор №1 ****** void Out_Displey_1(unsigned int Displey_Ust) { Cifra[7]=Displey_Ust/100; //сотни Cifra[6]=Displey_Ust%100/10; //десятки Cifra[6]=Cifra[6]|128; //вкл децимальную точку в разряде Cifra_6 Cifra[5]=Displey_Ust%10; //единицы
//*************************** Функция измерения напряжения на входах АЦП *************************** unsigned long ADC_Convert (unsigned char Kanal_ADC) { //ADMUX = ADMUX&224|Kanal_ADC; //выберем канал АЦП (обнулим биты MUX4-MUX0 в регистре ADMUX, не изменяя при этом биты 5,6,7, после этого заменим значение битов MUX4-MUX0 на номер(код) канала) ADMUX = ADMUX & 224; //выберем канал АЦП (сначала обнулим биты MUX4-MUX0 в регистре ADMUX, не изменяя при этом биты 5,6,7) ADMUX = ADMUX | Kanal_ADC; //выберем канал АЦП (затем заменим значение битов MUX4-MUX0 на номер(код) канала) ADCSRA |= (1<<ADSC); //Начинаем аналого-цифровое преобразование (для этого запишем 1 в бит ADSC регистра ADCSRA) while((ADCSRA & (1<<ADSC))); //Ждём когда закончиться аналого-цифровое преобразование (преобразование закончится, когда бит ADSC регистра ADCSRA станет равным 0) return (unsigned long) ADC; //Выйдем из функции и вернём (запишем) полученное значение (из регистров результата ADCL и ADCH) в переменную типа unsigned int }
//************************** Основная функция с бесконечным циклом ******************************* int main(void) { DDRC = 0B00000111;
while(1) { Displey1_ADC = ADC_Convert(4); //Считаем значение с 4 канала АЦП Out_Displey_1(Displey1_ADC); //Отправим считанное значение в функцию вывода на индикатор №1
Displey2_ADC = ADC_Convert(3); //Считаем значение с 3 канала АЦП Out_Displey_2(Displey2_ADC); //Отправим считанное значение в функцию вывода на индикатор №2 } } Спойлер
ну чо с max7219/tm18xx это като неспортивно...вон много ножек зря пропало лучше уж прикошатить наружный ADC разрядоф на 20..
Добавлено after 2 minutes 45 seconds: а свыводом на LED межка328 и так сама разберется кое ка... вот аардошная платка кой ка с этим справляется даже с штатными библиотеками
так это исшо не фсё... энкодеры в качестве задатчиков опорного напряжения и ещё кое что по мелочи... только вот терзают сумненья по поводу младшего разряда... не будет ли мельтишить... мож усреднять надо? или это шизофрения уже?
оригинал Спойлер опорное напряжение +5v0 Спойлер ничего не работает... и динамика кривоватая, маленькое времечко экспозиции разряда... в оригинале было по 16...20мс... смотрю в сторону max7219... но там я вообче никаких примеров не нашёл пока
Пример есть , но он не на AVR (( К сожалению . На PIC 16F 716 что из регуляторов оборотов пылесосов самсунг ! Там ещё подсчёт ёмкости идёт , если необходимо .
Добавлено after 30 minutes 1 second: Схема то универсальная , два индикатора (выше ниже) и плата 7219 над ней , скрепляются перемычками как бутерброд ... а там есть проги и под АВР и под МИКРОЧИПЫ !
Добавлено after 15 minutes 42 seconds: Универсальная плата будет на первой "плате" проекта LAY ОБЕ !
ну, в итоге, по такому сценарию буду пытаться развивать события Спойлер с этими вольтмеро-ампермерамиСпойлерпо измерению постоянного напряженияСпойлери тока с шунтаСпойлери бесконтактного датчикаСпойлерпостоянного токаСпойлерс выводом на семи сегментСпойлер
собрал, работает, но младший разряд отображает все возможные варианты от 0 до 8. надо усреднять данные в регистре adc. кто-нибудь может помочь с кодом? в код надо написать алгоритм усреднения оцифровки входных сигналов на входах admux_3 and admux_4 Спойлер
#define kolvo_dlya_sglaj 17 // по скольким результатам измерений вычислить среднее значение
unsigned long ADC_Convert (unsigned char Kanal_ADC) { uint32_t sum = 0; //ADMUX = ADMUX&224|Kanal_ADC; //выберем канал АЦП (обнулим биты MUX4-MUX0 в регистре ADMUX, не изменяя при этом биты 5,6,7, после этого заменим значение битов MUX4-MUX0 на номер(код) канала) ADMUX = ADMUX & 224; //выберем канал АЦП (сначала обнулим биты MUX4-MUX0 в регистре ADMUX, не изменяя при этом биты 5,6,7) ADMUX = ADMUX | Kanal_ADC; //выберем канал АЦП (затем заменим значение битов MUX4-MUX0 на номер(код) канала) for(uint8_t i = 0; i < kolvo_dlya_sglaj; ++i) { ADCSRA |= (1<<ADSC); //Начинаем аналого-цифровое преобразование (для этого запишем 1 в бит ADSC регистра ADCSRA) while((ADCSRA & (1<<ADSC))); //Ждём когда закончиться аналого-цифровое преобразование (преобразование закончится, когда бит ADSC регистра ADCSRA станет равным 0) sum += ADCW; } sum += kolvo_dlya_sglaj >> 1; sum /= kolvo_dlya_sglaj; return (unsigned long) sum; //Выйдем из функции и вернём (запишем) полученное значение (из регистров результата ADCL и ADCH) в переменную типа unsigned int }
Предпочитаю медианную или БИХ фильтрацию, достоинство последней в том, что вольтметр не ждёт несколько замеров ради одного отображения, а значит и не замирает, не подтупливает.СпойлерБИХ фильтр:
slav0n, ваше выражение справедливо пока ADC > Out_To_Display. Как только ADC станет < Out_To_Display, представляете какой результат получится? Давайте попробуем вычислить ADC - Out_To_Display, к примеру 120 - 400 = ?