Генератор для катушки Мишина

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

АндрейS пишет:

Иземнил. Не работает.  Но вот если вытащить ТДА то ток 65488 -65514 ма паказывает частота 0

что-то накосячил в схеме, смотри даташит на модуль, там нарисовано как он должен включаться

похоже с полярностью включения напутал +V это вход с блока питания -V нагрузка, вроде бы так

пост 22 посмотри

АндрейS
Offline
Зарегистрирован: 13.04.2018

С блока на vin + . На катушку vin - . Как у Ивана-исполина, а вот выводы 7 и 8 они тоже vin - и vin + называются, они не задействованы и на них резистор. У вас на фото, в первом посту подключено через 7 и 8 выводы

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

АндрейS пишет:

С блока на vin + . На катушку vin - . Как у Ивана-исполина, а вот выводы 7 и 8 они тоже vin - и vin + называются, они не задействованы и на них резистор. У вас на фото, в первом посту подключено через 7 и 8 выводы

да, включи через силовые, программа по ним калибруется

АндрейS
Offline
Зарегистрирован: 13.04.2018

 

Переподключил через силовые, все равно не работает. Продолжим в другой раз, поищу как проверяют ина219, может она неисправна.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

АндрейS пишет:

 

Переподключил через силовые, все равно не работает. Продолжим в другой раз, поищу как проверяют ина219, может она неисправна.

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

АндрейS
Offline
Зарегистрирован: 13.04.2018

ua6em пишет:

скетч простейший

Я так не смогу разобраться, буду искать подробный пример

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

АндрейS пишет:

ua6em пишет:

скетч простейший

Я так не смогу разобраться, буду искать подробный пример

Вот к примеру:
 

#include <Wire.h>
#include "ina219.h"

INA219 monitor;

void setup() {
  Serial.begin(9600);
  monitor.begin(64); // i2c address 64=0x40
  monitor.configure(0, 2, 11, 11, 7);
 
  /*  конфигурируем режим датчика тока INA219
   *  range, gain, bus_adc, shunt_adc, mode
   *  range = 1 (0-32V bus voltage range)
   *  gain = 3 (1/8 gain - 320mV range)
   *  bus adc = 3 (12-bit, single sample, 532uS conversion time)
   *  mode = 7 (continuous conversion)
   */

  monitor.calibrate(0.100, 0.32, 16, 3); 
 //R_шунта, напряж_шунта, макc_напряж, макс_ток
  }

  
void loop() {

 for (int i=1; i<16; i++){
 delay(300);
 int j = monitor.shuntCurrent() * 1000;
 Serial.print(j);Serial.print(" - ");
// Serial.print(monitor.shuntCurrent() * 1000,2);Serial.print(" - ");
 Serial.print(monitor.busVoltage()); Serial.println(" - v");
}
Serial.println();
}

 

АндрейS
Offline
Зарегистрирован: 13.04.2018

И через шунтирующий резистор подключить какую либо нагрузку и смотреть в мониторе порта?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

АндрейS пишет:

И через шунтирующий резистор подключить какую либо нагрузку и смотреть в мониторе порта?

можно так, в разрыв включить еще амперметр

Alp
Offline
Зарегистрирован: 22.01.2019

Получил травму руки, раньше, чем через неделю темой не займусь.

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

AJGrupp пишет:

Муж_Долговой пишет:

... синус/меандр... 

Что я увижу по осцилографу? И как это комментировать?...

На синусе Вы должны увидеть это:

синусНа меандре Вы должны увидеть это:

 

меандр

 

Если Вы увидите что-нибудь другое, например, как на предложенном Вам видео - значит генератор ТУФТА.

Вы упомянули однолучевой осцил., то есть старая модель?

У меня имеется С1-55, если желаете, продемонстрирую как на нём будет показывать при синусе и меандре.

Дошли руки с осцилографом сходить. Посмотрел. Без нагрузки (на разъёме катушки) просто "травка" растёт ... что меандр что синус.

С катушкой всё гораздо лучше. Меандр с провалом, как на вашем фото ... только сам провал не симметричный, а смещён левее. Синусоида больше похожа как на видео. Тоже провал смещён влево ... очень сильно. Что даже горбы (верхние пики) разные по высоте. Амплитуда на синусе в четыре раза выше, чем на меандре. Катушек в комплекте 4 штуки. На самой большой "мусор" по осцилографу. Средняя само блтже к идеалу. Возили этот прибор к Мишину ... он сказал "Нормально, только надо немножко доработать."

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

я меандр не делал, гармоники выше 1.5 мегагерца сильно не полезны, а так да, на резонансе левый горб поменьше...
Мишин пошёл дальше и с Горяевым модулируют катушку из данных базы его исследований, недавно видео было на ютубе

АндрейS
Offline
Зарегистрирован: 13.04.2018

С ина 219 похоже засада, Коряво работает. Подключал по этой схеме.

Без подключения показывает произвольные значения, подключаешь показывает нули. Если поменять подключение, плюс аккумулятора пдключить к V- а минус к  V+ то начинает что то показвать но Bus voltage всегда понулям. Сегодня получил еще одну ина219,у нее даже адрес не сканируется

Alp
Offline
Зарегистрирован: 22.01.2019

АндрейS пишет:

Сегодня получил еще одну ина219,у нее даже адрес не сканируется

Аналогично было у меня. Купил в другом форм-факторе. Пока вроде нормально. Вот в таком 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Да, у INA219 очень большой процент брака....
Попробуй замкнуть перемычки там их две, снача одну, потом другую, потом обе, начни с A0 и посканируй адреса

АндрейS
Offline
Зарегистрирован: 13.04.2018

Замыкание перемычек не помогло. Буду дальше играть в китайскую рулетку)) Русскую рулетку исключил, заказал с отслеживанием 4 штуки, из четырех хоть один то будет рабочий))

AJGrupp
Offline
Зарегистрирован: 24.07.2017

Viktor95 пишет:

AJGrupp пишет:

Вопрос 2:

- Какой диапазон частот должен быть у генератора?

Наверное, было бы странно, если используя AD9833 или AD9850, я буду сильно ограничивать их возможности...

Целевой диапазон: 0.1 Гц - 6 мГц.

Хорошо,

но напомню один момент, который, как оказалось, папуасы не ведают.

ПО УМОЛЧАНИЮ, у компонентов, применяемых для БУФЕРА, ПРЕДУСИЛИТЕЛЯ, УСИЛИТЕЛЯ

Unity Gain Bandwidth должен быть в 10 раз больше, чем частота.

То есть, для частоты в 5 мГц ОУ буффера должен иметь Unity Gain Bandwidth 50 Мгц.

(Соответственно, для обсуждаемых в теме  300 кГц частоты -> 3 мГц ОУ )

 

Проблем с подбором ОУ нет (ну,если только в головах), например, можно использовать AD826... и на выходе иметь 100 мА.

 

Вопрос.3:

- Какая мощность генератора Вам нужна?

 

AJGrupp
Offline
Зарегистрирован: 24.07.2017

Муж_Долговой пишет:

Меандр с провалом, как на вашем фото ... только сам провал не симметричный, а смещён левее.

Синусоида больше похожа как на видео. Тоже провал смещён влево ... очень сильно. Что даже горбы (верхние пики) разные по высоте. 

Значит - ФАЗЫ НЕ СВОДЯТСЯ.

("почему то", папуасы из секты Мишина пытаются свести только ДВЕ фазы).

Если фазы не сводятся, то от катушки будет только ЭМ МУСОР (сфера с радиусом около 60 см), как от плохого воздушного трансформатора, и очень-очень слабое Магнитное Поле, с пиком по оси катушки.

Никакого ЧУДО-Поля вы не получите, так как нет стартовой точки для дальнейшей настройки - "Имплозии".

АндрейS
Offline
Зарегистрирован: 13.04.2018

АндрейS пишет:

Сегодня получил еще одну ина219,у нее даже адрес не сканируется

Забыл написать что с последним модулем  генератор не запускался ни на скетче ua6em, ни на скетче Владимира. Не работал экран.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

посмотрел схему, мне не нравится идея запитки девайсов +5 вольтами от китайского стабилизатора, с него надо подавать на пин Vin ардуины напряжение от 7.5 до 9 вольт а снимать +5 с параметрического стабилизатора адруины, уж 0.5 ампера он точно вытянет спокойно, для этого и беру платки от Рободина, там стабилизаторы оригинальные, в общем буду безжалостно твою плату резать, да для запитки использую блок питания 9 вольт, хотя ....пороюсь в модулях...надо посмотреть как на оригинальной плате INA219 себя ведёт

АндрейS
Offline
Зарегистрирован: 13.04.2018

0.5 ампера хватит на АД9833, ина219 и экран 2004 с ic2? Я смотрел даташиты на эти модули но они на английском и я не смог понять какой ток они потребляют. Чем плох китайский стабилизатор?

Alp
Offline
Зарегистрирован: 22.01.2019

Посмотрел схему уже давно. Может мы разные схемы смотрим, но стабилизатор ардуины дает не более 150 мА при разнице вход-выход 2 В (пишу по памяти, но думаю точно достаточно).

Самое большое потребление при этом дисплея, для 1602 это 20 мА, все стальное цифровое в куче не более 1-2 мА.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Alp пишет:

Посмотрел схему уже давно. Может мы разные схемы смотрим, но стабилизатор ардуины дает не более 150 мА при разнице вход-выход 2 В (пишу по памяти, но думаю точно достаточно).

Самое большое потребление при этом дисплея, для 1602 это 20 мА, все стальное цифровое в куче не более 1-2 мА.

на китайской в отличии от оригинальной два стабилизатора 3.3 и 5 вольт, насколько не изменяет память 150 ма это по 3.3 вольтам, по 5 - значительно больше, на оригинальной 3.3 вольта получаются от микросхемы FTDI и они там есть когда девайc запитывается от USB (((
Получается, что китайский клон более продвинутый )))

Alp
Offline
Зарегистрирован: 22.01.2019

Фото своей китайской я приводил ранее. Там стоит примерно такая схема (у меня без перемычки):

По этой ссылке mic5205.pdf можно получить подробную информацию  о MIC5205 и расчете максимальной мощности для этого стабилизатора.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Поправил чуток код, перемычка A1 INA219 запаяна, теперь если не находим резонанс катушки, выставляем частоту 300Кгц
 

/*
 * Версия от 12.06.2019 - Добавлено измерение напряжения, вывод на дисплей, установка
 * начальной частоты определённой в дефайне, если не найден резонанс катушки
 * - напряжение показывало отрицательное, ina219 был сконфигурирован на адрес 44, 
 * - поправил скетч пробовал в работе при запитке от USB, на Vin+ подавал +5V с ардуины
 * - вывод Vin- (ina219) нагрузил резистором 10 ком, напряжение показывает, ток - 0 )))
 */
 
#include <Wire.h>
#include <SPI.h>
#include "LiquidCrystal_I2C.h"        // брал здесь - https://iarduino.ru/file/134.html
LiquidCrystal_I2C lcd(0x3F, 20, 4);   // Для экрана 20х4, I2C адрес дисплея уточнить  
//#include <Adafruit_INA219.h>
//Adafruit_INA219 ina219;

#include "ina219.h"
INA219 ina219;
 
unsigned int imax = 0;
unsigned int Data_ina219 = 0;
volatile float Voltage_ina219 = 0;
 
const int SINE = 0x2000;                    // определяем значение регистров AD9833 взависимости от формы сигнала
const int SQUARE = 0x2020;                  // После обновления частоты нужно определить форму сигнала
const int TRIANGLE = 0x2002;                // и произвести запись в регистр.
 
const float refFreq = 25000000.0;           // Частота кристалла на плате AD9833

#define Fdefine 300000
long Fmin = 200000;
long Fmax = 350000;
long FFmax = 0;
long freq = Fmin;
long ifreq = Fdefine; // если не будет определена частота резонанса катушки, 
                      // то она установится в это значение
int Ftune = 10000;
int Ffinetune = 200;
  
const int FSYNC = 10;                       // Standard SPI pins for the AD9833 waveform generator.
const int CLK = 13;                         // CLK and DATA pins are shared with the TFT display.
const int DATA = 11;
 
  
 /********* используемые подпрограммы выносим сюда *********/
  
// AD9833 documentation advises a 'Reset' on first applying power.
void AD9833reset() {
  WriteRegister(0x100);   // Write '1' to AD9833 Control register bit D8.
   delay(10);
 }
  
// *******************
// Set the frequency and waveform registers in the AD9833.
void AD9833setFrequency(long frequency, int Waveform) {
  long FreqWord = (frequency * pow(2, 28)) / refFreq;
  int MSB = (int)((FreqWord & 0xFFFC000) >> 14);    //Only lower 14 bits are used for data
  int LSB = (int)(FreqWord & 0x3FFF);
//Set control bits 15 ande 14 to 0 and 1, respectively, for frequency register 0
  LSB |= 0x4000;
  MSB |= 0x4000;
  WriteRegister(0x2100);
  WriteRegister(LSB);                  // Write lower 16 bits to AD9833 registers
  WriteRegister(MSB);                  // Write upper 16 bits to AD9833 registers.
  WriteRegister(0xC000);               // Phase register
  WriteRegister(Waveform);             // Exit & Reset to SINE, SQUARE or TRIANGLE
 }
 
// *************************
// Display and AD9833 use different SPI MODES so it has to be set for the AD9833 here.
 void WriteRegister(int dat) {
 SPI.setDataMode(SPI_MODE2);
 digitalWrite(FSYNC, LOW);           // Set FSYNC low before writing to AD9833 registers
 delayMicroseconds(10);              // Give AD9833 time to get ready to receive data.
 SPI.transfer(highByte(dat));        // Each AD9833 register is 32 bits wide and each 16
 SPI.transfer(lowByte(dat));         // bits has to be transferred as 2 x 8-bit bytes.
  digitalWrite(FSYNC, HIGH);          //Write done. Set FSYNC high
}

// Процедура грубой настройки частоты по максимальному току
 void setFreq(){
 for (int i=1; i <= 15; i++) {
   // Data_ina219=ina219.getCurrent_mA();
      Data_ina219=ina219.shuntCurrent() * 1000; 
    if (Data_ina219 > imax){ imax=Data_ina219; ifreq = freq; } // Если значение больше, то запомнить
    if (freq >=Fmax) {freq = Fmax;}
     freq=freq+Ftune;
     AD9833setFrequency(freq, SINE);
     delay(20);
    } 
 }

// Процедура тонкой настройки частоты по максимальному току
 void setFFreq(){
    for (int j=1; j <= 100; j++) {
     //Data_ina219=ina219.getCurrent_mA();
     Data_ina219=ina219.shuntCurrent() * 1000; 
     if (Data_ina219 > imax){ imax=Data_ina219; ifreq = freq; } // Если значение больше, то запомнить
     freq=freq+Ffinetune;
     if (freq >=FFmax) {freq = FFmax;} 
     AD9833setFrequency(freq, SINE);
     delay(20);
     //Data_ina219=ina219.getCurrent_mA();
     //Data_ina219=ina219.shuntCurrent() * 1000; 
    } 
 }

//************************** SETUP *************************/
void setup() { 
  SPI.begin();
  Serial.begin(115200);
 // lcd.init(); //для библиотеки V112
  lcd.begin();
  lcd.backlight();
  delay(10);   
    
 // ina219.begin(0x40); //такая конфигурация конфликтует с дисплеем
 // ina219.begin();
 // ina219.setCalibration_16V_400mA(); 
 // ina219.setCalibration_32V_2A();  // Интересно, в библиотеку можно внести изменения
  delay(10);                       // сделав свои параметры калибровки? надо 16V 2A

  ina219.begin(0x44); // (44) i2c address 64=0x40 68=0х44 исправлять и в ina219.h одновременно
  ina219.configure(0, 2, 12, 12, 7); // 16S -8.51ms
 // monitor.configure(0, 2, 10, 10, 7); // 4S -2.13ms
 // monitor.configure(0, 2, 11, 11, 7); // 8S -4.26ms
 // monitor.configure(0, 2, 12, 12, 7); // 16S -8.51ms
 // monitor.configure(0, 2, 13, 13, 7); // 32S -17.02ms
 // monitor.configure(0, 2, 14, 14, 7); // 64S -34.05ms
 // monitor.configure(0, 2, 15, 15, 7);  // 128S - 68.10ms
 // monitor.configure(0, 2, 8, 8, 7);
                           // range, gain, bus_adc, shunt_adc, mode
                           // range = 1 (0-32V bus voltage range)
                           // gain = 3 (1/8 gain - 320mV range)
                           // bus adc = 3 (12-bit, single sample, 532uS conversion time)
                           // shunt adc = 3 (12-bit, single sample, 532uS conversion time)
                           // mode = 7 (continuous conversion)

  ina219.calibrate(0.100, 0.32, 16, 3.2); 
                // R_шунта, напряж_шунта, макcнапряж, максток
 
  
  AD9833reset();                   // Ресет после включения питания
  delay(10);
  AD9833setFrequency(freq, SINE);  // выставляем нижнюю частоту
  //
  setFreq();
  Serial.print("freq=");
  Serial.println(freq);
  freq = ifreq-10000;
  FFmax =ifreq +10000;
  imax = 0;
  AD9833setFrequency(freq, SINE); 
  setFFreq();
  Serial.print("ffreq=");
  Serial.println(ifreq);
  AD9833setFrequency(ifreq, SINE); // выставляем частоту максимального тока
 // Data_ina219=ina219.getCurrent_mA();
  Data_ina219=ina219.shuntCurrent() * 1000; 
    lcd.setCursor(2, 0);                  // 1 строка, начало
    lcd.print("Freq = ");
    float freq_tic = ifreq/1000;
    lcd.print(freq_tic,2);
    lcd.print("kHz");
    lcd.setCursor(2, 1);                  // 2 строка, начало
    lcd.print("I = ");
  //  lcd.setCursor(5, 1);                  // 2 строка 7 позиция
    lcd.print(Data_ina219);
    lcd.print("ma");
    lcd.setCursor(2, 3); 
    lcd.print("Generator AD9833");
    delay(1);

  }    // Конец процедуры инициализации прибора
  
 
// ТЕЛО ПРОГРАММЫ
 
void loop() {

 // Data_ina219=ina219.getCurrent_mA();
  Data_ina219=ina219.shuntCurrent() * 1000; 
  Voltage_ina219 = ina219.busVoltage();
 // lcd.setCursor(0, 0);                  // 1 строка
 // lcd.print("Freq = ");
 
   lcd.setCursor(9, 0);                   //1 строка 7 позиция
   float freq_tic = ifreq/1000;
   lcd.print(freq_tic,2);
   lcd.print("kHz");
   lcd.setCursor(2, 1);                  // 2 строка
   lcd.print("I = ");
  // lcd.setCursor(5, 1);                  // 2 строка 7 позиция
   lcd.print(Data_ina219);
   lcd.print("ma");
   lcd.setCursor(2, 2); 
   lcd.print("Vpp = ");
   lcd.print(Voltage_ina219,2);
   lcd.print("V");
   lcd.setCursor(2, 3); 
   lcd.print("Generator AD9833");
   Serial.println();
   Serial.print("Напряжение = ");
   Serial.println( Voltage_ina219,2);
   Serial.print("Ток = ");
   Serial.println(Data_ina219);
   Serial.println();
   delay(200);
 } //END

 

АндрейS
Offline
Зарегистрирован: 13.04.2018

ua6em, это уже рабочий код?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

АндрейS пишет:

ua6em, это уже рабочий код?

попробуй, я еще плату полностью не набил, но все девайсы уже на плате, запитываю пока только от USB

Непонятно с TDA - там не хватает пары контактов, я бы запаивал прямо в плату или использовал другой тип разъема (с плоскими выводами), такие делались в ссср и сейчас производство восстановили, в каких-то объемах

PS у меня работает, кроме тока, очень мал для измерения

АндрейS
Offline
Зарегистрирован: 13.04.2018

попробовал, экран работает, катушка работает, ток=0, пик пик=0. Из за неисправной ина219 не понятно

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

АндрейS пишет:

попробовал, экран работает, катушка работает, ток=0, пик пик=0. Из за неисправной ина219 не понятно

перемычку А1 на INA219 запаял?

АндрейS
Offline
Зарегистрирован: 13.04.2018

ua6em,   перемычка это другой адресс? У меня ина219 не работает. Или есть вероятность что с другим адресом заработает?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

АндрейS пишет:

ua6em,   перемычка это другой адресс? У меня ина219 не работает. Или есть вероятность что с другим адресом заработает?

выложенный скетч настроен на адрес 44, запаяй перемычку и проверь

АндрейS
Offline
Зарегистрирован: 13.04.2018

я адрес в скетче менял на то что у меня определился, но модуль ина219 не рабочий

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

АндрейS пишет:

я адрес в скетче менял на то что у меня определился, но модуль ина219 не рабочий

переведи на 44 и попробуй, ведь не просто так я на этот 44 адрес датчик перетаскивал, помню, что был какой-то затык и адрес подбирался, или определялся но измерения не шли, одним словом пробуй, с этим ina219 не всё так просто

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Работает!!!

Alp
Offline
Зарегистрирован: 22.01.2019

Отлично!

Настроился на резонанс?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Alp пишет:

Отлично!

Настроился на резонанс?


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

Alp
Offline
Зарегистрирован: 22.01.2019

Плз. дайте еще раз ссылки на последние варианты использованных библиотек (в тексте скетча только одна ссылка). Аж больная рука зачесалась попробовать.

В начале скетча из поста 375 есть строка #include "ina219.h" это ошибка? нет такого файла, видимо надо #include "INA219.h"

Еще компилятор ругается на эту строку Data_ina219 = ina219.shuntCurrent() * 1000;  error: 'class INA219' has no member named 'shuntCurrent'

 
АндрейS
Offline
Зарегистрирован: 13.04.2018

ina219.cpp

/******************************************************************************
* TI INA219 hi-side i2c current/power monitor Library
*
* <a href="http://www.ti.com/product/ina219" title="http://www.ti.com/product/ina219" rel="nofollow">http://www.ti.com/product/ina219</a>
*
* 6 May 2012 by John De Cristofaro
*
*
* Tested at standard i2c 100kbps signaling rate.
*
* This library does not handle triggered conversion modes. It uses the INA219
* in continuous conversion mode. All reads are from continous conversions.
*
* A note about the gain (PGA) setting:
*  The gain of the ADC pre-amplifier is programmable in the INA219, and can
* be set between 1/8x (default) and unity. This allows a shunt voltage 
* range of +/-320mV to +/-40mV respectively. Something to keep in mind,
* however, is that this change in gain DOES NOT affect the resolution
* of the ADC, which is fixed at 1uV. What it does do is increase noise
* immunity by exploiting the integrative nature of the delta-sigma ADC.
* For the best possible reading, you should set the gain to the range
* of voltages that you expect to see in your particular circuit. See
* page 15 in the datasheet for more info about the PGA.
*
* Known bugs:
*     * may return unreliable values if not connected to a bus or at
* bus currents below 10uA.
*
* Arduino 1.0 compatible as of 6/6/2012
*
* Dependencies:
*    * Arduino Wire library
*
* MIT license
******************************************************************************/

#include "ina219.h"
#include <util/delay.h>

INA219::INA219() {
}


void INA219::begin(uint8_t addr)
{
  Wire.begin();
  i2c_address = addr;
  gain = D_GAIN;
}


// calibration of equations and device
// shunt_val    = value of shunt in Ohms
// v_shunt_max    = maximum value of voltage across shunt
// v_bus_max    = maximum voltage of bus
// i_max_expected   = maximum current draw of bus + shunt
// default values are for a 0.25 Ohm shunt on a 5V bus with max current of 1A
void INA219::calibrate(float shunt_val, float v_shunt_max, float v_bus_max, float i_max_expected)
{
  uint16_t cal;
  float i_max_possible, min_lsb, max_lsb, swap;

  r_shunt = shunt_val;

  i_max_possible = v_shunt_max / r_shunt;
  min_lsb = i_max_expected / 32767;
  max_lsb = i_max_expected / 4096;

  current_lsb = (uint16_t)(min_lsb * 100000000) + 1;
  current_lsb /= 100000000;
  swap = (0.04096)/(current_lsb*r_shunt);
  cal = (uint16_t)swap;
  power_lsb = current_lsb * 20;

#if (INA219_DEBUG == 1)
  Serial.print("v_bus_max:  "); Serial.println(v_bus_max, 8);
  Serial.print("v_shunt_max:  "); Serial.println(v_shunt_max, 8);
  Serial.print("i_max_possible: "); Serial.println(i_max_possible, 8);
  Serial.print("i_max_expected: "); Serial.println(i_max_expected, 8);
  Serial.print("min_lsb:  "); Serial.println(min_lsb, 12);
  Serial.print("max_lsb:  "); Serial.println(max_lsb, 12);
  Serial.print("current_lsb:  "); Serial.println(current_lsb, 12);
  Serial.print("power_lsb:  "); Serial.println(power_lsb, 8);
  Serial.println("  ");
  Serial.print("cal:    "); Serial.println(cal);
  Serial.print("r_shunt:  "); Serial.println(r_shunt);
#endif

  write16(CAL_R, cal);

}


// config values (range, gain, bus adc, shunt adc, mode) can be derived from pp26-27 in the datasheet
// defaults are:
// range = 1 (0-32V bus voltage range)
// gain = 3 (1/8 gain - 320mV range)
// bus adc = 3 (12-bit, single sample, 532uS conversion time)
// shunt adc = 3 (12-bit, single sample, 532uS conversion time)
// mode = 7 (continuous conversion)
void INA219::configure(uint8_t range, uint8_t gain, uint8_t bus_adc, uint8_t shunt_adc, uint8_t mode)
{
  config = 0;

  config |= (range << BRNG | gain << PG0 | bus_adc << BADC1 | shunt_adc << SADC1 | mode);

  write16(CONFIG_R, config);    
}

// resets the INA219
void INA219::reset()
{
  write16(CONFIG_R, INA_RESET);
  _delay_ms(5);
}

// returns the raw binary value of the shunt voltage
int16_t INA219::shuntVoltageRaw()
{
  return read16(V_SHUNT_R);
}

// returns the shunt voltage in volts.
float INA219::shuntVoltage()
{
  float temp;
  temp = read16(V_SHUNT_R);
  return (temp / 100000);
}

// returns raw bus voltage binary value
int16_t INA219::busVoltageRaw()
{
  return read16(V_BUS_R);
}

// returns the bus voltage in volts
float INA219::busVoltage()
{
  int16_t temp;
  temp = read16(V_BUS_R);
  temp >>= 3;
  return (temp * 0.004);
}

// returns the shunt current in amps
float INA219::shuntCurrent()
{
  return (read16(I_SHUNT_R) * current_lsb);
}

// returns the bus power in watts
float INA219::busPower()
{
  return (read16(P_BUS_R) * power_lsb);
}


/**********************************************************************
*       INTERNAL I2C FUNCTIONS            *
**********************************************************************/

// writes a 16-bit word (d) to register pointer (a)
// when selecting a register pointer to read from, (d) = 0
void INA219::write16(uint8_t a, uint16_t d) {
  uint8_t temp;
  temp = (uint8_t)d;
  d >>= 8;
  Wire.beginTransmission(i2c_address); // start transmission to device

  #if ARDUINO >= 100
    Wire.write(a); // sends register address to read from
    Wire.write((uint8_t)d);  // write data hibyte 
    Wire.write(temp); // write data lobyte;
  #else
    Wire.send(a); // sends register address to read from
    Wire.send((uint8_t)d);  // write data hibyte 
    Wire.send(temp); // write data lobyte;
  #endif

  Wire.endTransmission(); // end transmission
  delay(1);
}


int16_t INA219::read16(uint8_t a) {
  uint16_t ret;

  // move the pointer to reg. of interest, null argument
  write16(a, 0);
  
  Wire.requestFrom((int)i2c_address, 2);  // request 2 data bytes

  #if ARDUINO >= 100
    ret = Wire.read(); // rx hi byte
    ret <<= 8;
    ret |= Wire.read(); // rx lo byte
  #else
    ret = Wire.receive(); // rx hi byte
    ret <<= 8;
    ret |= Wire.receive(); // rx lo byte
  #endif

  Wire.endTransmission(); // end transmission

  return ret;
}

ina219.h

/******************************************************************************
* TI INA219 hi-side i2c current/power monitor Library
*
* <a href="http://www.ti.com/product/ina219" title="http://www.ti.com/product/ina219" rel="nofollow">http://www.ti.com/product/ina219</a>
*
* 6 May 2012 by John De Cristofaro
*
*
* Tested at standard i2c 100kbps signaling rate.
*
* This library does not handle triggered conversion modes. It uses the INA219
* in continuous conversion mode. All reads are from continous conversions.
*
* A note about the gain (PGA) setting:
*  The gain of the ADC pre-amplifier is programmable in the INA219, and can
* be set between 1/8x (default) and unity. This allows a shunt voltage 
* range of +/-320mV to +/-40mV respectively. Something to keep in mind,
* however, is that this change in gain DOES NOT affect the resolution
* of the ADC, which is fixed at 1uV. What it does do is increase noise
* immunity by exploiting the integrative nature of the delta-sigma ADC.
* For the best possible reading, you should set the gain to the range
* of voltages that you expect to see in your particular circuit. See
* page 15 in the datasheet for more info about the PGA.
*
* Known bugs:
*     * may return unreliable values if not connected to a bus or at
* bus currents below 10uA.
*
* Arduino 1.0 compatible as of 6/6/2012
*
* Dependencies:
*    * Arduino Wire library
*
* MIT license
******************************************************************************/

#ifndef ina219_h
#define ina219_h


#if ARDUINO >= 100
 #include "Arduino.h"
#else
 #include "WProgram.h"
#endif

#include <Wire.h>

#define INA219_DEBUG 1

// INA219 memory registers
#define CONFIG_R    0x00  // configuration register
#define V_SHUNT_R   0x01  // differential shunt voltage
#define V_BUS_R     0x02  // bus voltage (wrt to system/chip GND)
#define P_BUS_R     0x03  // system power draw (= V_BUS * I_SHUNT)
#define I_SHUNT_R   0x04  // shunt current
#define CAL_R     0x05  // calibration register

#define INA_RESET   0xFFFF  // send to CONFIG_R to reset unit

#define CONFIG_DEFAULT    0x399F

// config. register bit labels
#define RST 15
#define BRNG  13
#define PG1 12
#define PG0 11
#define BADC4 10
#define BADC3 9
#define BADC2 8
#define BADC1 7
#define SADC4 6
#define SADC3 5
#define SADC2 4
#define SADC1 3
#define MODE3 2
#define MODE2 1
#define MODE1 0

// default values
#define D_I2C_ADDRESS 68 // (64) - адрес по умочанию, перемычки на датчике разомкнуты
#define D_RANGE     1
#define D_GAIN      3
#define D_SHUNT_ADC   3
#define D_BUS_ADC   3
#define D_MODE      7
#define D_SHUNT     0.25
#define D_V_BUS_MAX   6
#define D_V_SHUNT_MAX   0.3
#define D_I_MAX_EXPECTED  1


class INA219
{
  public:
  INA219();
  
  // by default uses addr = 0x40 (both a-pins tied low)
  void begin(uint8_t addr = D_I2C_ADDRESS);

  void calibrate(float r_shunt = D_SHUNT, float v_shunt_max = D_V_SHUNT_MAX, float v_bus_max = D_V_BUS_MAX, float i_max_expected = D_I_MAX_EXPECTED);

  void configure(uint8_t range = D_RANGE, uint8_t gain = D_GAIN, uint8_t bus_adc = D_BUS_ADC, uint8_t shunt_adc = D_SHUNT_ADC, uint8_t mode = D_MODE);

  void reset();

  int16_t shuntVoltageRaw();
  int16_t busVoltageRaw();
  float shuntVoltage();
  float busVoltage();
  float shuntCurrent();
  float busPower();


  private:
  uint8_t i2c_address;
  float r_shunt, current_lsb, power_lsb;
  uint16_t config, cal, gain;

  int16_t read16(uint8_t addr);
  void write16(uint8_t addr, uint16_t data);

};

#endif

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Библиотеки есть тут вложить в папку скетча #325

Крайняя версия скетча вот:
 

 
#include <Wire.h>
#include <SPI.h>
#include "LiquidCrystal_I2C.h"         // брал здесь - https://iarduino.ru/file/134.html
LiquidCrystal_I2C lcd(0x3F, 20, 4);   // Для экрана 20х4, I2C адрес дисплея уточнить  
//#include <Adafruit_INA219.h>
//Adafruit_INA219 ina219;

#include "INA219.h"
INA219 ina219;
 
unsigned int imax = 0;
unsigned int Data_ina219 = 0;
volatile float Voltage_ina219 = 0;
 
const int SINE = 0x2000;                    // определяем значение регистров AD9833 взависимости от формы сигнала
const int SQUARE = 0x2020;                  // После обновления частоты нужно определить форму сигнала
const int TRIANGLE = 0x2002;                // и произвести запись в регистр.
 
const float refFreq = 25000000.0;           // Частота кристалла на плате AD9833

#define Fdefine 300000
long Fmin = 50000;
long Fmax = 500000;
long FFmax = 0;
long freq = Fmin;
long ifreq = Fdefine; // если не будет определена частота резонанса катушки, 
                      // то она установится в это значение
int Ftune = 10000;
int Ffinetune = 200;
  
const int FSYNC = 10;                       // Standard SPI pins for the AD9833 waveform generator.
const int CLK = 13;                         // CLK and DATA pins are shared with the TFT display.
const int DATA = 11;
 
  
 /********* используемые подпрограммы выносим сюда *********/
  
// AD9833 documentation advises a 'Reset' on first applying power.
void AD9833reset() {
  WriteRegister(0x100);   // Write '1' to AD9833 Control register bit D8.
   delay(10);
 }
  
// *******************
// Set the frequency and waveform registers in the AD9833.
void AD9833setFrequency(long frequency, int Waveform) {
  long FreqWord = (frequency * pow(2, 28)) / refFreq;
  int MSB = (int)((FreqWord & 0xFFFC000) >> 14);    //Only lower 14 bits are used for data
  int LSB = (int)(FreqWord & 0x3FFF);
//Set control bits 15 ande 14 to 0 and 1, respectively, for frequency register 0
  LSB |= 0x4000;
  MSB |= 0x4000;
  WriteRegister(0x2100);
  WriteRegister(LSB);                  // Write lower 16 bits to AD9833 registers
  WriteRegister(MSB);                  // Write upper 16 bits to AD9833 registers.
  WriteRegister(0xC000);               // Phase register
  WriteRegister(Waveform);             // Exit & Reset to SINE, SQUARE or TRIANGLE
 }
 
// *************************
// Display and AD9833 use different SPI MODES so it has to be set for the AD9833 here.
 void WriteRegister(int dat) {
 SPI.setDataMode(SPI_MODE2);
 digitalWrite(FSYNC, LOW);           // Set FSYNC low before writing to AD9833 registers
 delayMicroseconds(10);              // Give AD9833 time to get ready to receive data.
 SPI.transfer(highByte(dat));        // Each AD9833 register is 32 bits wide and each 16
 SPI.transfer(lowByte(dat));         // bits has to be transferred as 2 x 8-bit bytes.
  digitalWrite(FSYNC, HIGH);          //Write done. Set FSYNC high
}

// Процедура грубой настройки частоты по максимальному току
 void setFreq(){
 for (int i=1; i <= 50; i++) {
   // Data_ina219=ina219.getCurrent_mA();
      Data_ina219=ina219.shuntCurrent() * 1000; 
    if (Data_ina219 > imax){ imax=Data_ina219; ifreq = freq; } // Если значение больше, то запомнить
    if (freq >=Fmax) {freq = Fmax;}
     freq=freq+Ftune;
     AD9833setFrequency(freq, SINE);
     delay(20);
    } 
 }

// Процедура тонкой настройки частоты по максимальному току
 void setFFreq(){
    for (int j=1; j <= 100; j++) {
     //Data_ina219=ina219.getCurrent_mA();
     Data_ina219=ina219.shuntCurrent() * 1000; 
     if (Data_ina219 > imax){ imax=Data_ina219; ifreq = freq; } // Если значение больше, то запомнить
     freq=freq+Ffinetune;
     if (freq >=FFmax) {freq = FFmax;} 
     AD9833setFrequency(freq, SINE);
     delay(20);
     //Data_ina219=ina219.getCurrent_mA();
     //Data_ina219=ina219.shuntCurrent() * 1000; 
    } 
 }

//************************** SETUP *************************/
void setup() { 
  SPI.begin();
  Serial.begin(115200);
 // lcd.init(); //для библиотеки V112
  lcd.begin();
  lcd.backlight();
  delay(10);   
    
 // ina219.begin(0x40); //такая конфигурация конфликтует с дисплеем
 // ina219.begin();
 // ina219.setCalibration_16V_400mA(); 
 // ina219.setCalibration_32V_2A();  // Интересно, в библиотеку можно внести изменения
  delay(10);                       // сделав свои параметры калибровки? надо 16V 2A

  ina219.begin(0x44); // (44) i2c address 64=0x40 68=0х44 исправлять и в ina219.h одновременно
  ina219.configure(0, 2, 12, 12, 7); // 16S -8.51ms
 // monitor.configure(0, 2, 10, 10, 7); // 4S -2.13ms
 // monitor.configure(0, 2, 11, 11, 7); // 8S -4.26ms
 // monitor.configure(0, 2, 12, 12, 7); // 16S -8.51ms
 // monitor.configure(0, 2, 13, 13, 7); // 32S -17.02ms
 // monitor.configure(0, 2, 14, 14, 7); // 64S -34.05ms
 // monitor.configure(0, 2, 15, 15, 7);  // 128S - 68.10ms
 // monitor.configure(0, 2, 8, 8, 7);
                           // range, gain, bus_adc, shunt_adc, mode
                           // range = 1 (0-32V bus voltage range)
                           // gain = 3 (1/8 gain - 320mV range)
                           // bus adc = 3 (12-bit, single sample, 532uS conversion time)
                           // shunt adc = 3 (12-bit, single sample, 532uS conversion time)
                           // mode = 7 (continuous conversion)

  ina219.calibrate(0.100, 0.32, 16, 3.2); 
                // R_шунта, напряж_шунта, макcнапряж, максток
 
  
  AD9833reset();                   // Ресет после включения питания
  delay(10);
  AD9833setFrequency(freq, SINE);  // выставляем нижнюю частоту
  //
  setFreq();
  Serial.print("freq=");
  Serial.println(freq);
  freq = ifreq-10000;
  FFmax =ifreq +10000;
  imax = 0;
  AD9833setFrequency(freq, SINE); 
  setFFreq();
  Serial.print("ffreq=");
  Serial.println(ifreq);
  AD9833setFrequency(ifreq, SINE); // выставляем частоту максимального тока
 // Data_ina219=ina219.getCurrent_mA();
  Data_ina219=ina219.shuntCurrent() * 1000; 
    lcd.setCursor(2, 0);                  // 1 строка, начало
    lcd.print("Freq = ");
    float freq_tic = ifreq/1000;
    lcd.print(freq_tic,2);
    lcd.print("kHz");
    lcd.setCursor(2, 1);                  // 2 строка, начало
    lcd.print("I = ");
  //  lcd.setCursor(5, 1);                  // 2 строка 7 позиция
    lcd.print(Data_ina219);
    lcd.print("ma");
    lcd.setCursor(2, 3); 
    lcd.print("Generator AD9833");
    delay(1);

  }    // Конец процедуры инициализации прибора
  
 
// ТЕЛО ПРОГРАММЫ
 
void loop() {

 // Data_ina219=ina219.getCurrent_mA();
  Data_ina219=ina219.shuntCurrent() * 1000; 
  Voltage_ina219 = ina219.busVoltage();
 // lcd.setCursor(0, 0);                  // 1 строка
 // lcd.print("Freq = ");
 
   lcd.setCursor(9, 0);                   //1 строка 7 позиция
   float freq_tic = ifreq/1000;
   lcd.print(freq_tic,2);
   lcd.print("kHz");
   lcd.setCursor(2, 1);                  // 2 строка
   lcd.print("I = ");
  // lcd.setCursor(5, 1);                  // 2 строка 7 позиция
   lcd.print(Data_ina219);
   lcd.print("ma");
   lcd.setCursor(2, 2); 
   lcd.print("Vpp = ");
   lcd.print(Voltage_ina219,2);
   lcd.print("V");
   lcd.setCursor(2, 3); 
   lcd.print("Generator AD9833");
   Serial.println();
   Serial.print("Напряжение = ");
   Serial.println( Voltage_ina219,2);
   Serial.print("Ток = ");
   Serial.println(Data_ina219);
   Serial.println();
   delay(200);
 } //END

 

Alp
Offline
Зарегистрирован: 22.01.2019

Увы, последняя версия тоже не компилируется. Ошибки выдает те же http://arduino.ru/forum/proekty/generator-dlya-katushki-mishina?page=7#comment-461241

 

АндрейS
Offline
Зарегистрирован: 13.04.2018

Для экрана https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library . У меня последний скетч из 389 поста компилируется с библиотеками из 388 и что по ссылке

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Правильные названия файлов INA219.h INA219.cpp

Поправил скетч

Скетч работает, но сигнал на моей пробной плате не айс, то-есть совсем не айс, возбуды в районе 3-5 мгц и .т.д.
Осциллограммы нет смысла выкладывать настолько там всё плохо...
Но есть и хорошая новость, программа работает )))

Да, аппаратно не увидел согласования уровней с AD9833 на TDA-7056, у последней коэффициент усиления порядка 100 раз по напряжению, значит на вход надо подавать 50-60 милливольт, а AD9833 выдаёт 0,65 вольта, нужен делитель.

АндрейS
Offline
Зарегистрирован: 13.04.2018

ua6em пишет:

 не айс, возбуды в районе 3-5 мгц и .т.д.


 
Все плохо на сколько?

У меня на tda7056A такие:

 с катушкой

вторя без

tda 7056B c катушкой:

без катушки:

Думал что верхушка синуса обрезана из за конденсатора, поменял, не помогло. С АД9833 сигнал нормальный, после tda обрезанный.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

у меня совсем плохо, но резонанс находит...
берём за основу 7056B и улучшаем, прямо на выводы питания микросхемы (панельки) напаяй два конденсатора 0,1мкф керамика и 1,0мкф электролит или плёночный и посмотрим осциллограммку

АндрейS
Offline
Зарегистрирован: 13.04.2018

Конденсатор поключать одной ногой на питание другой на землю микросхемы?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

АндрейS пишет:

Конденсатор поключать одной ногой на питание другой на землю микросхемы?


ну да, прямо на микросхеме ставим конденсаторы по питанию, 220 мкф пусть останутся на своём месте, сдаётся мне что это возбуд

АндрейS
Offline
Зарегистрирован: 13.04.2018

у меня электролит 100 мкф и пленочный 100 нф стоят, завтра пойду куплю конденсаторы, у меня 0,1 мкф нет

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ставь какие есть керамика 0,068 и тд

АндрейS
Offline
Зарегистрирован: 13.04.2018

0,1 мкф керамику нашел, был где то электролит 47 мкф, это много?

поставил керамику 0.1 мкф и электролит 6,8 мкф не помогло

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

У тебя плата разведена так же как и у меня?