Обсуждаем контроллеры компании Atmel.
Ответить

Re: 3-х разрядный ампервольтметр на атмега

Вт дек 29, 2020 13:51:29

господа вы правда верите что какаято квадрато мелевичная херня с нощками даже без ИОН???? хернясумет мерить достоверно 230/400VAC в сети? да+ и токовского в придачу???
НЕ ВЕРЮ!

Re: 3-х разрядный ампервольтметр на атмега

Вт дек 29, 2020 15:09:12

квадрато мелевичная херня с нощками даже без ИОН????

Это какая конкретно херня?
Без ИОН никто ничего никак не измерит точно)

Re: 3-х разрядный ампервольтметр на атмега

Вт дек 29, 2020 18:27:43

оригинал
Спойлер

опорное напряжение +5v0
СпойлерИзображение

ничего не работает... и динамика кривоватая, маленькое времечко экспозиции разряда... в оригинале было по 16...20мс... смотрю в сторону max7219... но там я вообче никаких примеров не нашёл пока

Re: 3-х разрядный ампервольтметр на атмега

Вт дек 29, 2020 22:32:06

Ну, у вас ведь по току инвертирующий усилитель.
По напряжению зачем-то RV3, так-же в странном положении выставлен.
Вот и показывает 0.
И, да, я с протеусом не знаком. Но, в 1-м посте темы индикаторные вольтметры показывали какие-то значения. А здесь не показывают.
и динамика кривоватая, маленькое времечко экспозиции разряда

В комментариях время экспозиции каждого разряда расписано.

Re: 3-х разрядный ампервольтметр на атмега

Ср дек 30, 2020 09:41:47

да схема в протеусе полнстью работала, движки обоих в разных положениях были... ничего не показывало, индикация по 20мс была...

Re: 3-х разрядный ампервольтметр на атмега

Сб янв 02, 2021 08:50:13

В качестве пятничной развлекухи программа вольтамперметра с разверткой индикации от тактирования АЦП без использования таймера.
-встроенная опора 2,56V
-каждый параметр оцифровывается 256 раз с суммированием в 3-байтном счетчике; округленный результат в 2-х старших байтах счетчика
-далее конвертация для вывода на индикацию с гашением незначащих нулей
В железе не проверялось. Возможно, где-то накосячил. :dont_know:
Вложения
AV_meter.zip
(2.28 KiB) Скачиваний: 217

Re: 3-х разрядный ампервольтметр на атмега

Вс янв 17, 2021 21:47:14

пал ниц перед талантливым нжинеером и он написал заветный код
Спойлер#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;

Data_In[Adres_Reg] = Data_In_Write;
Adres_Reg_Copy = Adres_Reg; //создадим копию значения переменной Adres_Reg

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; //единицы


for(X=5;X<8;X++)
{
Data_In[X] = Cifra[X];
Write_MAX7219(X,Data_In[X]);
}
}


//******** Функция вывода значений на 7 сегм.индикатор №2 ******
void Out_Displey_2(unsigned int Displey_Ust)
{
Cifra[4]=15; //Отключим не используемую цифру старшего разряда индикатора №2
Cifra[3]=Displey_Ust/100; //сотни
Cifra[2]=Displey_Ust%100/10; //десятки
Cifra[2]=Cifra[2]|128; //вкл децимальную точку в разряде Cifra_2
Cifra[1]=Displey_Ust%10; //единицы

for(X=1;X<5;X++)
{
Data_In[X] = Cifra[X];
Write_MAX7219(X,Data_In[X]);
}
}


//*************************** Функция измерения напряжения на входах АЦП ***************************
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;

Inicializat_MAX7219(); //Инициализация MAX7219

//Инициализация АЦП
ADCSRA |= (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);//Разрешение использования АЦП, Делитель 128 = 125 кГц
ADMUX &= ~((1<<REFS0)|(1<<REFS1)); //Источник опорного напряжения Aref=5v0

//Displey1_ADC=351;
//Displey2_ADC=795;
//Out_Displey_1(Displey1_ADC);
//Out_Displey_2(Displey2_ADC);

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
}
}

СпойлерИзображение

Re: 3-х разрядный ампервольтметр на атмега

Вс янв 17, 2021 22:16:56

ну чо с max7219/tm18xx это като неспортивно...вон много ножек зря пропало
лучше уж прикошатить наружный ADC разрядоф на 20..

Добавлено after 2 minutes 45 seconds:
а свыводом на LED межка328 и так сама разберется кое ка... вот аардошная платка кой ка с этим справляется даже с штатными библиотеками

Re: 3-х разрядный ампервольтметр на атмега

Пн янв 18, 2021 17:20:26

вон много ножек зря пропало
так это исшо не фсё... энкодеры в качестве задатчиков опорного напряжения и ещё кое что по мелочи... только вот терзают сумненья по поводу младшего разряда... не будет ли мельтишить... мож усреднять надо? или это шизофрения уже?

Re: 3-х разрядный ампервольтметр на атмега

Ср янв 20, 2021 03:44:40

попробуй мож не так все пдохо и сойдет... мелтешение младшего вашета класикеа в цифре...

Re: 3-х разрядный ампервольтметр на атмега

Ср янв 27, 2021 21:29:05

оригинал
Спойлер

опорное напряжение +5v0
СпойлерИзображение

ничего не работает... и динамика кривоватая, маленькое времечко экспозиции разряда... в оригинале было по 16...20мс... смотрю в сторону max7219... но там я вообче никаких примеров не нашёл пока

Пример есть , но он не на AVR (( К сожалению . На PIC 16F 716 что из регуляторов оборотов пылесосов самсунг ! Там ещё подсчёт ёмкости идёт , если необходимо .

Добавлено after 30 minutes 1 second:
Схема то универсальная , два индикатора (выше ниже) и плата 7219 над ней , скрепляются перемычками как бутерброд ... а там есть проги и под АВР и под МИКРОЧИПЫ !

Добавлено after 15 minutes 42 seconds:
Универсальная плата будет на первой "плате" проекта LAY ОБЕ !
Вложения
универсальная плата на 7219.lay6
(114.37 KiB) Скачиваний: 218
схема.jpg
(142.58 KiB) Скачиваний: 226

Re: 3-х разрядный ампервольтметр на атмега

Чт апр 08, 2021 21:22:06

ну, в итоге, по такому сценарию буду пытаться развивать события
СпойлерИзображение
с этими вольтмеро-ампермерами
СпойлерИзображение
по измерению постоянного напряжения
СпойлерИзображение
и тока с шунта
СпойлерИзображение
и бесконтактного датчика
СпойлерИзображение
постоянного тока
СпойлерИзображение
с выводом на семи сегмент
СпойлерИзображение
Вложения
gerber_drill_2.zip
(122.36 KiB) Скачиваний: 171
gerber_drill.zip
(115.67 KiB) Скачиваний: 170

Re: 3-х разрядный ампервольтметр на атмега

Вт май 04, 2021 12:49:53

собрал, работает, но младший разряд отображает все возможные варианты от 0 до 8. надо усреднять данные в регистре adc. кто-нибудь может помочь с кодом? в код надо написать алгоритм усреднения оцифровки входных сигналов на входах admux_3 and admux_4
СпойлерИзображение Изображение Изображение
Вложения
main.c
(9.5 KiB) Скачиваний: 169

Re: 3-х разрядный ампервольтметр на атмега

Чт май 06, 2021 21:59:34

Kturj
Код:
#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
}

Re: 3-х разрядный ампервольтметр на атмега

Пт май 07, 2021 07:19:06

а это что такое?
Карбофос писал(а):  sum += kolvo_dlya_sglaj >> 1;

Re: 3-х разрядный ампервольтметр на атмега

Пт май 07, 2021 07:38:00

Интересно глянуть осциллографом на ножке Aref после mos34063a ?

Re: 3-х разрядный ампервольтметр на атмега

Пт май 07, 2021 08:50:54

Starichok51 писал(а):а это что
это правильное округление

Re: 3-х разрядный ампервольтметр на атмега

Пт май 07, 2021 14:49:29

это правильное округление
Предпочитаю медианную или БИХ фильтрацию, достоинство последней в том, что вольтметр не ждёт несколько замеров ради одного отображения, а значит и не замирает, не подтупливает.
СпойлерБИХ фильтр:
Код:
sum+=ADC_Оut;
Out_To_Display=sum>>StSglag;
sum-=Out_Tо_Display;
StSglag - константа, характеризующая степень фильтрации

Re: 3-х разрядный ампервольтметр на атмега

Сб май 08, 2021 05:23:36

Код:
Out_To_Display += (ADC - Out_To_Display) / 2;

Re: 3-х разрядный ампервольтметр на атмега

Сб май 08, 2021 07:25:24

slav0n, ваше выражение справедливо пока ADC > Out_To_Display.
Как только ADC станет < Out_To_Display, представляете какой результат получится?
Давайте попробуем вычислить ADC - Out_To_Display, к примеру 120 - 400 = ?
Ответить