Форум РадиоКот https://radiokot.ru/forum/ |
|
3-х разрядный ампервольтметр на атмега https://radiokot.ru/forum/viewtopic.php?f=57&t=174539 |
Страница 1 из 4 |
Автор: | charchyard [ Вс дек 20, 2020 16:31:31 ] | ||||
Заголовок сообщения: | 3-х разрядный ампервольтметр на атмега | ||||
Здравствуйте коты! я, к сожаленью, полнейший нуль в программировании. Помогите скрестить ежа и ужа. Нашёл в Сети видео вольтметра на семисегментном 3-х индикаторе мк атмега_8 или атмега_16. предел 0...100в с точностью 0,1в... и амперметр 0...100а с точностью 0,1а. шунт 100а 75мВ. Вопрос как правильно скрестить две программы, чтобы атмега оцифровывала поочерёдно эти переменные на входах PA0 и PA1 и выводила на два 3-х разрядных 7-индикатора ОА. программа для вольтметра и амперметра одна. А вот как запихнуть эти две функции в одну микру?
|
Автор: | Martin76 [ Вс дек 20, 2020 16:56:28 ] |
Заголовок сообщения: | Re: 3-х разрядный ампервольтметр на атмега |
Вот есть готовая проверенная схема на пике https://vrtp.ru/index.php?act=categorie ... ticle=2792 там прошивка до 99,9А есть. |
Автор: | АлександрЛ [ Вс дек 20, 2020 18:52:08 ] |
Заголовок сообщения: | Re: 3-х разрядный ампервольтметр на атмега |
А вот как запихнуть эти две функции в одну микру? Вариант 1 - написать свою программу (прошивку), если умеете. Вариант 2 - ОПЛАТИТЬ написание своей прошивки Вариант 3 - Тщательнее искать нужную схему Вариант 4 - купить готовый AV метр - https://aliexpress.ru/item/1005001356302861.html |
Автор: | 1en2 [ Вс дек 20, 2020 18:58:50 ] |
Заголовок сообщения: | Re: 3-х разрядный ампервольтметр на атмега |
5. Раз два индикатора, то ставить две атмеги и ничего никуда не запихивать (раз сам не можешь)... |
Автор: | musor [ Вс дек 20, 2020 20:19:05 ] |
Заголовок сообщения: | Re: 3-х разрядный ампервольтметр на атмега |
5 вариант не лучший...и да я ранше тоже сам паял на 7107 сначала дип а потом QFP щас тупа заказали мешок разных с алехи и ставлю не парясь.. 123 конечно возможен но толка из любви к трудностям=садо маза... автору пока 4 вариан такого добра наштампованано на любой вкус и цвет ка с жидами так и на LCD |
Автор: | charchyard [ Вс дек 20, 2020 22:39:30 ] |
Заголовок сообщения: | Re: 3-х разрядный ампервольтметр на атмега |
Александр здравствуйте! Цитата: Вариант 2 - ОПЛАТИТЬ написание своей прошивки если сможете написать, то дайте знать. такие головки я покупал в Китае и они у меня есть. но не подходят.
|
Автор: | АлександрЛ [ Вс дек 20, 2020 22:55:11 ] |
Заголовок сообщения: | Re: 3-х разрядный ампервольтметр на атмега |
Если бы я умел писать прошивки, то у меня проблем было бы намного меньше.. А так- приходится пользоваться тем, что кто- то написал А чем вас китайские ампервольтметры не устраивают? У меня тоже пара таких валяется, когда я их проверял, там амперметр, даже после попытки его настроить, врал раза в 1,5.. Но как- бы, проблемы с их использованием нет.. |
Автор: | Карбофос [ Пн дек 21, 2020 20:15:24 ] |
Заголовок сообщения: | Re: 3-х разрядный ампервольтметр на атмега |
На AREF лучше опорник на TL431. Естественно, программа в живую не проверялась. СпойлерКод: #define F_CPU 1000000uL // частота тактирования мк // ATmega16 #include <avr/io.h> #include <avr/interrupt.h> // библиотека прерываний включена коды символов для индикатора #include <string.h> // 0 1 2 3 4 5 6 7 8 9 нет uint8_t code_numbers_indicator[11] = { 40, 235, 49, 161, 226, 164, 36, 233, 32, 160, 255 }; // кол-во каналов #define nChannels 2 // доп.разрядов на измерение каждого канала #define nExtraBit 3 // кол-во измерений каждого канала #define nMeasPerCh (1 << nExtraBit) // массив с результатами работы АЦП по каналам volatile uint16_t auRawADC[nChannels]; // флаг окончания цикла по каналам volatile uint8_t bADCcomplete; ISR(ADC_vect) { static uint8_t nMeasure = 0; // номер текущего канала АЦП uint8_t nNowConv = ADMUX & 0b111; // получаем значение из регистра данных auRawADC[nNowConv] += ADCW; if(++nMeasure < nMeasPerCh) { // очередной запуск измерения текущего канала ADCSRA |= 1 << ADSC; } else { // обнуляем счетчик кол-ва измерений nMeasure = 0; // усредняем значение auRawADC[nNowConv] += (1 << (nExtraBit - 1)); auRawADC[nNowConv] >>=nExtraBit; // сброс номера канала ADMUX &= 0b11100000; // если не все каналы оцифрованы if(++nNowConv < nChannels) { ADMUX |= nNowConv; // следующий канал АЦП ADCSRA |= 1 << ADSC; } else { // цикл оцифровки каналов окончен bADCcomplete = 1; } } } #define NumDigits 6 typedef struct { // подключение общего анода индикатора volatile uint8_t * ddr; volatile uint8_t * port; uint8_t pin; // сегменты uint8_t seg; } typDigit; // 2 индикатора 6 цифр по-сегментно typDigit aDisp[NumDigits] = { {&DDRD, &PORTD, 7, 10}, {&DDRC, &PORTC, 0, 0}, {&DDRC, &PORTC, 1, 0}, {&DDRC, &PORTC, 2, 10}, {&DDRC, &PORTC, 3, 0}, {&DDRC, &PORTC, 4, 0} }; void dataProcessing ( void ) { // значения aDisp[0].seg = auRawADC[0] / 100; aDisp[1].seg = auRawADC[0] % 100; aDisp[2].seg = aDisp[1].seg % 10; aDisp[1].seg /= 10; aDisp[3].seg = auRawADC[1] / 100; aDisp[4].seg = auRawADC[1] % 100; aDisp[5].seg = aDisp[4].seg % 10; aDisp[4].seg /= 10; // преобразуем числовые значения в набор сегментов for(uint8_t i = 0; i < NumDigits; ++i) aDisp[i].seg = code_numbers_indicator[aDisp[i].seg]; // десятичная точка aDisp[1].seg &= ~(1<<5); aDisp[4].seg &= ~(1<<5); } volatile uint8_t nShowDigit; ISR (TIMER0_COMP_vect) // прерывание по совпадению таймера T0 работа с разрядами индикатора { // отключить общий анод предыдущего индикатора *aDisp[nShowDigit].port |= (1 << aDisp[nShowDigit].pin); // следующая цифра if(++nShowDigit >= NumDigits) nShowDigit = 0; // выставляем сегменты PORTB = aDisp[nShowDigit].seg; // включаем общий анод *aDisp[nShowDigit].port &= ~(1 << aDisp[nShowDigit].pin); } void Setup(void) { // таймер смены отборажения цифр // Каждая цифра отображается T = 64*(1+OCR0)/F_CPU = 64*(1+24)/1000000=1.6мсек OCR0=24; // число в регистре сравнения COMP TCCR0=0b00001011; // преддделитель /64; сброс по совпадению чисел в регистрах TCNT0 & OCR0 TIMSK|=(1<<1); // вектор прерывания сработает по совпадению // сегменты индикаторов PORTB = 255; // выставляем порт PB в единичное состояние DDRB = 255; // выставляем порт PB на вывод // пины общих анодов на вывод for(uint8_t i = 0; i < NumDigits; ++i) *aDisp[i].ddr |= (1 << aDisp[i].pin); // АЦП ADMUX |=(0<<REFS0)|(0<<REFS1)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(0<<MUX0); // опорное Vref=+AREF(refs0/refs1); входной канал PA0(mux0...mux4) ADCSRA|=(1<<ADEN)|(1<<ADIE)|(1<<ADIF)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); // вкл ацп (aden); разрешение прерывания (adie); предделитель adc /128 (adps0...adps2) DDRA &= ~((1<<1)|(1<<0)); // настраиваем 0 и 1 биты порт А на ввод (вход ацп) } int main (void) { Setup(); // обнуляем массив значений каналов memset((void*)auRawADC, 0, sizeof(auRawADC)); // флаг окончания цикла оцифровки каналов bADCcomplete = 0; // номер цифры для отображения nShowDigit = 0; sei(); // разрешаем прерывания // запуск АЦП ADCSRA |= 1 << ADSC; while(1) { if(nShowDigit == NumDigits - 1 && bADCcomplete) { dataProcessing(); memset((void*)auRawADC, 0, sizeof(auRawADC)); bADCcomplete = 0; // запуск АЦП ADCSRA |= 1 << ADSC; } } } |
Автор: | charchyard [ Ср дек 23, 2020 16:58:19 ] |
Заголовок сообщения: | Re: 3-х разрядный ампервольтметр на атмега |
вах... так щаз мы её и проверим а там опорное +5в0 предполагается? а чем опорное питание с 7805 не нравиться? |
Автор: | charchyard [ Сб дек 26, 2020 16:18:48 ] | ||
Заголовок сообщения: | Re: 3-х разрядный ампервольтметр на атмега | ||
не компилирует код атмелстудия... ошибки какие-то... я такое починить не смогу
|
Автор: | Карбофос [ Сб дек 26, 2020 19:24:54 ] |
Заголовок сообщения: | Re: 3-х разрядный ампервольтметр на атмега |
Про атмел-студию ничего не могу сказать, т.к. не пользуюсь ей. Может быть, местные обитатели подскажут, как в ней собрать. Я в командной строке make-ом собираю, avr-gcc компилятор. Приложил собранный проект. |
Автор: | charchyard [ Пн дек 28, 2020 13:00:43 ] |
Заголовок сообщения: | Re: 3-х разрядный ампервольтметр на атмега |
да код рабочий теперь осталось понять куда в шпротеусе подключать вход делителя вольтметра и выход усилка амперметра и как индикаторы к меге подключать ну вот же тупой бл |
Автор: | Карбофос [ Пн дек 28, 2020 19:05:33 ] |
Заголовок сообщения: | Re: 3-х разрядный ампервольтметр на атмега |
Вход делителя вольтметра и выход усилка амперметра - PA0, PA1. Катоды (сегменты) всех индикаторов - как и в оригинальной схеме, через токоограничительные резисторы к порту PB. Общие аноды 1-го 3-х разрядного индикатора - как в оригинальной схеме, через транзисторные ключи, старший PD7, средний PC0, младший PC1. Общие аноды 2-го 3-х разрядного индикатора - так-же через транзисторные ключи, старший PС2, средний PC3, младший PC4. Подключение сегментов жестко задано - порт PB с привязкой каждого сегмента к конкретному пину. Код: uint8_t code_numbers_indicator[11] ={40, 235, 49, 161, 226, 164, 36, 233, 32, 160, 255 }; Подключение общих анодов задано массивом Код: // 2 индикатора 6 цифр по-сегментно
typDigit aDisp[NumDigits] = { {&DDRD, &PORTD, 7, 10}, // общий анод старшего разряда 1-го индикатора {&DDRC, &PORTC, 0, 0}, // общий анод среднего разряда 1-го индикатора {&DDRC, &PORTC, 1, 0}, // общий анод младшего разряда 1-го индикатора {&DDRC, &PORTC, 2, 10}, // общий анод старшего разряда 2-го индикатора {&DDRC, &PORTC, 3, 0}, // общий анод среднего разряда 2-го индикатора {&DDRC, &PORTC, 4, 0} // общий анод младшего разряда 2-го индикатора }; |
Автор: | Ivanoff-iv [ Вт дек 29, 2020 07:11:21 ] |
Заголовок сообщения: | Re: 3-х разрядный ампервольтметр на атмега |
Подключение сегментов жестко задано - порт PB с привязкой каждого сегмента к конкретному пину. Меня както ARV научил как это писать правильней...Код: uint8_t code_numbers_indicator[11] ={40, 235, 49, 161, 226, 164, 36, 233, 32, 160, 255 }; СпойлерКод: //Digits Всё это можно вынести в отдельный файл и приинклюдить.//Описание цифр семисегментного индикатора //соответствие сегмента и номера ноги порта #define N_A 0 #define N_B 2 #define N_C 4 #define N_D 6 #define N_E 7 #define N_F 1 #define N_G 3 #define N_DP 5 //расстановка единиц в маске #define _A (1<<N_A) #define _B (1<<N_B) #define _C (1<<N_C) #define _D (1<<N_D) #define _E (1<<N_E) #define _F (1<<N_F) #define _G (1<<N_G) #define _DP (1<<N_DP) //знакогенератор #define _0 ~(_A|_B|_C|_D|_E|_F ) #define _1 ~( _B|_C ) #define _2 ~(_A|_B| _D|_E| _G) #define _3 ~(_A|_B|_C|_D| _G) #define _4 ~( _B|_C| _F|_G) #define _5 ~(_A| _C|_D| _F|_G) #define _6 ~(_A| _C|_D|_E|_F|_G) #define _7 ~(_A|_B|_C ) #define _8 ~(_A|_B|_C|_D|_E|_F|_G) #define _9 ~(_A|_B|_C|_D| _F|_G) //#define _a ~(_A|_B|_C| _E|_F|_G) //#define _b ~( _C|_D|_E|_F|_G) //#define _c ~(_A| _D|_E|_F| ) //#define _d ~( _B|_C|_D|_E| _G) //#define _e ~(_A| _D|_E|_F|_G) //#define _f ~(_A| _E|_F|_G) #define _Z ~(0 ) //выключенный разряд #define _N ~( _G) // "-" flash unsigned char code_numbers_indicator[]={_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_Z}; (Номера твоих пинов я сюда не подставлял) Не спорю, наверно можно ещё правильней написать, например для ОА/ОК дисплеев автоматизировать перерисовку... |
Автор: | Рязанцев Владислав [ Вт дек 29, 2020 09:46:47 ] |
Заголовок сообщения: | Re: 3-х разрядный ампервольтметр на атмега |
Берете ардуину, пишете 10 строк, готово) при условии AREF =5В Код: Напряжение на ноге= float(map(AnalogRead(A0),0, 1023, 0,500)/100)
Вывести на индикатор какой у вас там, все тоже самое для тока |
Автор: | Карбофос [ Вт дек 29, 2020 11:16:55 ] |
Заголовок сообщения: | Re: 3-х разрядный ампервольтметр на атмега |
Ivanoff-iv, вы, наверное, не смотрели 1-ый пост темы. Этот массив определен в приложенной к нему исходному коду программы в соответствии с приципиальной схемой. Предложенное вами решение, конечно-же, более универсальное. Что я и постарался сделать с ОА. Но, "лишние" 44 строки текста при текущих 147 всей программы??? Рязанцев Владислав, а что готово-то? |
Автор: | Рязанцев Владислав [ Вт дек 29, 2020 12:33:20 ] |
Заголовок сообщения: | Re: 3-х разрядный ампервольтметр на атмега |
а что готово-то? А что не готово? В среде ардуино все делается обычно подключением готовых библиотек. Можно за индикатор тот же TM1637 взять готовым модулем. Добавить библиотеку одна строка, вывести на него еще одна строка) |
Автор: | Ivanoff-iv [ Вт дек 29, 2020 13:19:01 ] |
Заголовок сообщения: | Re: 3-х разрядный ампервольтметр на атмега |
этот код не усложнит чтение кода (т.к. лежит в отдельном файле) и не утяжеляет прошивку (т.к. обсчитывается на этапе компиляции)... Ну... если проект окончательный и обжалованию... изменению не подлежит, то и ладно... (в конце концов - кто код пишет, тот имена переменным и придумывает ) |
Автор: | Serzh2000 [ Вт дек 29, 2020 13:21:09 ] |
Заголовок сообщения: | Re: 3-х разрядный ампервольтметр на атмега |
charchyard киньте пожалуйста ссылку на первоисточник откуда вы взяли эти схемы и код. |
Страница 1 из 4 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |