Генератор для катушки Мишина
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- …
- следующая ›
- последняя »
- Войдите на сайт для отправки комментариев
За основу проекта взята известная схема генератора для катушки Мишина на основе генератора на микросхеме XR2206 (174ГФ2) и усилителя мощности на микросхеме TDA7056.
В схему генератора введены цепи авутоматической подстройки частоты на резонансную частоту катушки на основе следующих компонентов: датчик тока - INA219, управление arduino nano, цепь управления частотой - DAC MCP4725 в связке с полевым транзистором КП103.
Микропроцессорное управление позволяет устранить недостатки генератора по этой схеме описанные к примеру здесь.
Реализован режим синуса и режим меандра, ручной и автоматический режим работы генератора.
Обмен данными между управляющим модулем и датчиками осуществляется по шине I2C.
Ручной и автоматический режимы реализованы полностью независимыми, то-есть при переводе генератора в ручной режим коммутация соответствует базовой схеме. В автоматическом режиме элементы регулировки частоты переключаются на цифровой блок DAC, а в качестве регулирующего частоту элемента использован полевой транзистор КП103.
В настоящий момент программа управления несовершенна, имеет глюки и выкладывать её полностью не вижу смысла, но если проект станет кому-то интересен, можно доработать, а возможно разработать с нуля совместными усилиями.
Основа скетча:
01 | #include <Wire.h> |
02 | #include "ina219.h" |
03 | #include <Adafruit_MCP4725.h> |
04 | Adafruit_MCP4725 dac; |
05 | INA219 monitor; |
06 |
07 | /************************** SETUP *************************/ |
08 | void setup () { |
09 | Serial .begin(9600); |
10 | digitalWrite(8, LOW); |
11 | monitor.begin(64); // i2c address 64=0x40 |
12 | // monitor.configure(0, 2, 10, 10, 7); // 4S -2.13ms |
13 | // monitor.configure(0, 2, 11, 11, 7); // 8S -4.26ms |
14 | monitor.configure(0, 2, 12, 12, 7); // 16S -8.51ms |
15 | // monitor.configure(0, 2, 13, 13, 7); // 32S -17.02ms |
16 | // monitor.configure(0, 2, 14, 14, 7); // 64S -34.05ms |
17 | // monitor.configure(0, 2, 15, 15, 7); // 128S - 68.10ms |
18 | // monitor.configure(0, 2, 8, 8, 7); |
19 | // range, gain, bus_adc, shunt_adc, mode |
20 | // range = 1 (0-32V bus voltage range) |
21 | // gain = 3 (1/8 gain - 320mV range) |
22 | // bus adc = 3 (12-bit, single sample, 532uS conversion time) |
23 | // shunt adc = 3 (12-bit, single sample, 532uS conversion time) |
24 | // mode = 7 (continuous conversion) |
25 | monitor.calibrate(0.100, 0.32, 16, 3.2); |
26 | // R_шунта, напряж_шунта, макcнапряж, максток |
27 | |
28 | dac.begin(0x62); |
29 | dac.setVoltage(dfreq, true ); |
30 | delay(10); |
31 | initDAC(); // Регулировка через ЦАП 12 бит, находим резонансную частоту при включении прибора |
32 | } // Конец процедуры инициализации прибора |
Коды библиотеки:
INA219.H
001 | /****************************************************************************** |
002 | * TI INA219 hi-side i2c current/power monitor Library |
003 | * |
004 | * <a href="http://www.ti.com/product/ina219" title="http://www.ti.com/product/ina219" rel="nofollow">http://www.ti.com/product/ina219</a> |
005 | * |
006 | * 6 May 2012 by John De Cristofaro |
007 | * |
008 | * |
009 | * Tested at standard i2c 100kbps signaling rate. |
010 | * |
011 | * This library does not handle triggered conversion modes. It uses the INA219 |
012 | * in continuous conversion mode. All reads are from continous conversions. |
013 | * |
014 | * A note about the gain (PGA) setting: |
015 | * The gain of the ADC pre-amplifier is programmable in the INA219, and can |
016 | * be set between 1/8x (default) and unity. This allows a shunt voltage |
017 | * range of +/-320mV to +/-40mV respectively. Something to keep in mind, |
018 | * however, is that this change in gain DOES NOT affect the resolution |
019 | * of the ADC, which is fixed at 1uV. What it does do is increase noise |
020 | * immunity by exploiting the integrative nature of the delta-sigma ADC. |
021 | * For the best possible reading, you should set the gain to the range |
022 | * of voltages that you expect to see in your particular circuit. See |
023 | * page 15 in the datasheet for more info about the PGA. |
024 | * |
025 | * Known bugs: |
026 | * * may return unreliable values if not connected to a bus or at |
027 | * bus currents below 10uA. |
028 | * |
029 | * Arduino 1.0 compatible as of 6/6/2012 |
030 | * |
031 | * Dependencies: |
032 | * * Arduino Wire library |
033 | * |
034 | * MIT license |
035 | ******************************************************************************/ |
036 |
037 | #ifndef ina219_h |
038 | #define ina219_h |
039 |
040 |
041 | #if ARDUINO >= 100 |
042 | #include "Arduino.h" |
043 | #else |
044 | #include "WProgram.h" |
045 | #endif |
046 |
047 | #include <Wire.h> |
048 |
049 | #define INA219_DEBUG 1 |
050 |
051 | // INA219 memory registers |
052 | #define CONFIG_R 0x00 // configuration register |
053 | #define V_SHUNT_R 0x01 // differential shunt voltage |
054 | #define V_BUS_R 0x02 // bus voltage (wrt to system/chip GND) |
055 | #define P_BUS_R 0x03 // system power draw (= V_BUS * I_SHUNT) |
056 | #define I_SHUNT_R 0x04 // shunt current |
057 | #define CAL_R 0x05 // calibration register |
058 |
059 | #define INA_RESET 0xFFFF // send to CONFIG_R to reset unit |
060 |
061 | #define CONFIG_DEFAULT 0x399F |
062 |
063 | // config. register bit labels |
064 | #define RST 15 |
065 | #define BRNG 13 |
066 | #define PG1 12 |
067 | #define PG0 11 |
068 | #define BADC4 10 |
069 | #define BADC3 9 |
070 | #define BADC2 8 |
071 | #define BADC1 7 |
072 | #define SADC4 6 |
073 | #define SADC3 5 |
074 | #define SADC2 4 |
075 | #define SADC1 3 |
076 | #define MODE3 2 |
077 | #define MODE2 1 |
078 | #define MODE1 0 |
079 |
080 | // default values |
081 | #define D_I2C_ADDRESS 0x40 // (64) |
082 | #define D_RANGE 1 |
083 | #define D_GAIN 3 |
084 | #define D_SHUNT_ADC 3 |
085 | #define D_BUS_ADC 3 |
086 | #define D_MODE 7 |
087 | #define D_SHUNT 0.25 |
088 | #define D_V_BUS_MAX 6 |
089 | #define D_V_SHUNT_MAX 0.3 |
090 | #define D_I_MAX_EXPECTED 1 |
091 |
092 |
093 | class INA219 |
094 | { |
095 | public : |
096 | INA219(); |
097 | |
098 | // by default uses addr = 0x40 (both a-pins tied low) |
099 | void begin(uint8_t addr = D_I2C_ADDRESS); |
100 |
101 | 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); |
102 |
103 | 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); |
104 |
105 | void reset(); |
106 |
107 | int16_t shuntVoltageRaw(); |
108 | int16_t busVoltageRaw(); |
109 | float shuntVoltage(); |
110 | float busVoltage(); |
111 | float shuntCurrent(); |
112 | float busPower(); |
113 |
114 |
115 | private : |
116 | uint8_t i2c_address; |
117 | float r_shunt, current_lsb, power_lsb; |
118 | uint16_t config, cal, gain; |
119 |
120 | int16_t read16(uint8_t addr); |
121 | void write16(uint8_t addr, uint16_t data); |
122 |
123 | }; |
124 |
125 | #endif |
INA219.CPP
001 | /****************************************************************************** |
002 | * TI INA219 hi-side i2c current/power monitor Library |
003 | * |
004 | * <a href="http://www.ti.com/product/ina219" title="http://www.ti.com/product/ina219" rel="nofollow">http://www.ti.com/product/ina219</a> |
005 | * |
006 | * 6 May 2012 by John De Cristofaro |
007 | * |
008 | * |
009 | * Tested at standard i2c 100kbps signaling rate. |
010 | * |
011 | * This library does not handle triggered conversion modes. It uses the INA219 |
012 | * in continuous conversion mode. All reads are from continous conversions. |
013 | * |
014 | * A note about the gain (PGA) setting: |
015 | * The gain of the ADC pre-amplifier is programmable in the INA219, and can |
016 | * be set between 1/8x (default) and unity. This allows a shunt voltage |
017 | * range of +/-320mV to +/-40mV respectively. Something to keep in mind, |
018 | * however, is that this change in gain DOES NOT affect the resolution |
019 | * of the ADC, which is fixed at 1uV. What it does do is increase noise |
020 | * immunity by exploiting the integrative nature of the delta-sigma ADC. |
021 | * For the best possible reading, you should set the gain to the range |
022 | * of voltages that you expect to see in your particular circuit. See |
023 | * page 15 in the datasheet for more info about the PGA. |
024 | * |
025 | * Known bugs: |
026 | * * may return unreliable values if not connected to a bus or at |
027 | * bus currents below 10uA. |
028 | * |
029 | * Arduino 1.0 compatible as of 6/6/2012 |
030 | * |
031 | * Dependencies: |
032 | * * Arduino Wire library |
033 | * |
034 | * MIT license |
035 | ******************************************************************************/ |
036 |
037 | #include "INA219.h" |
038 | #include <util/delay.h> |
039 |
040 | INA219::INA219() { |
041 | } |
042 |
043 |
044 | void INA219::begin(uint8_t addr) |
045 | { |
046 | Wire.begin(); |
047 | i2c_address = addr; |
048 | gain = D_GAIN; |
049 | } |
050 |
051 |
052 | // calibration of equations and device |
053 | // shunt_val = value of shunt in Ohms |
054 | // v_shunt_max = maximum value of voltage across shunt |
055 | // v_bus_max = maximum voltage of bus |
056 | // i_max_expected = maximum current draw of bus + shunt |
057 | // default values are for a 0.25 Ohm shunt on a 5V bus with max current of 1A |
058 | void INA219::calibrate( float shunt_val, float v_shunt_max, float v_bus_max, float i_max_expected) |
059 | { |
060 | uint16_t cal; |
061 | float i_max_possible, min_lsb, max_lsb, swap; |
062 |
063 | r_shunt = shunt_val; |
064 |
065 | i_max_possible = v_shunt_max / r_shunt; |
066 | min_lsb = i_max_expected / 32767; |
067 | max_lsb = i_max_expected / 4096; |
068 |
069 | current_lsb = (uint16_t)(min_lsb * 100000000) + 1; |
070 | current_lsb /= 100000000; |
071 | swap = (0.04096)/(current_lsb*r_shunt); |
072 | cal = (uint16_t)swap; |
073 | power_lsb = current_lsb * 20; |
074 |
075 | #if (INA219_DEBUG == 1) |
076 | Serial .print( "v_bus_max: " ); Serial .println(v_bus_max, 8); |
077 | Serial .print( "v_shunt_max: " ); Serial .println(v_shunt_max, 8); |
078 | Serial .print( "i_max_possible: " ); Serial .println(i_max_possible, 8); |
079 | Serial .print( "i_max_expected: " ); Serial .println(i_max_expected, 8); |
080 | Serial .print( "min_lsb: " ); Serial .println(min_lsb, 12); |
081 | Serial .print( "max_lsb: " ); Serial .println(max_lsb, 12); |
082 | Serial .print( "current_lsb: " ); Serial .println(current_lsb, 12); |
083 | Serial .print( "power_lsb: " ); Serial .println(power_lsb, 8); |
084 | Serial .println( " " ); |
085 | Serial .print( "cal: " ); Serial .println(cal); |
086 | Serial .print( "r_shunt: " ); Serial .println(r_shunt); |
087 | #endif |
088 |
089 | write16(CAL_R, cal); |
090 |
091 | } |
092 |
093 |
094 | // config values (range, gain, bus adc, shunt adc, mode) can be derived from pp26-27 in the datasheet |
095 | // defaults are: |
096 | // range = 1 (0-32V bus voltage range) |
097 | // gain = 3 (1/8 gain - 320mV range) |
098 | // bus adc = 3 (12-bit, single sample, 532uS conversion time) |
099 | // shunt adc = 3 (12-bit, single sample, 532uS conversion time) |
100 | // mode = 7 (continuous conversion) |
101 | void INA219::configure(uint8_t range, uint8_t gain, uint8_t bus_adc, uint8_t shunt_adc, uint8_t mode) |
102 | { |
103 | config = 0; |
104 |
105 | config |= (range << BRNG | gain << PG0 | bus_adc << BADC1 | shunt_adc << SADC1 | mode); |
106 |
107 | write16(CONFIG_R, config); |
108 | } |
109 |
110 | // resets the INA219 |
111 | void INA219::reset() |
112 | { |
113 | write16(CONFIG_R, INA_RESET); |
114 | _delay_ms(5); |
115 | } |
116 |
117 | // returns the raw binary value of the shunt voltage |
118 | int16_t INA219::shuntVoltageRaw() |
119 | { |
120 | return read16(V_SHUNT_R); |
121 | } |
122 |
123 | // returns the shunt voltage in volts. |
124 | float INA219::shuntVoltage() |
125 | { |
126 | float temp; |
127 | temp = read16(V_SHUNT_R); |
128 | return (temp / 100000); |
129 | } |
130 |
131 | // returns raw bus voltage binary value |
132 | int16_t INA219::busVoltageRaw() |
133 | { |
134 | return read16(V_BUS_R); |
135 | } |
136 |
137 | // returns the bus voltage in volts |
138 | float INA219::busVoltage() |
139 | { |
140 | int16_t temp; |
141 | temp = read16(V_BUS_R); |
142 | temp >>= 3; |
143 | return (temp * 0.004); |
144 | } |
145 |
146 | // returns the shunt current in amps |
147 | float INA219::shuntCurrent() |
148 | { |
149 | return (read16(I_SHUNT_R) * current_lsb); |
150 | } |
151 |
152 | // returns the bus power in watts |
153 | float INA219::busPower() |
154 | { |
155 | return (read16(P_BUS_R) * power_lsb); |
156 | } |
157 |
158 |
159 | /********************************************************************** |
160 | * INTERNAL I2C FUNCTIONS * |
161 | **********************************************************************/ |
162 |
163 | // writes a 16-bit word (d) to register pointer (a) |
164 | // when selecting a register pointer to read from, (d) = 0 |
165 | void INA219::write16(uint8_t a, uint16_t d) { |
166 | uint8_t temp; |
167 | temp = (uint8_t)d; |
168 | d >>= 8; |
169 | Wire.beginTransmission(i2c_address); // start transmission to device |
170 |
171 | #if ARDUINO >= 100 |
172 | Wire.write(a); // sends register address to read from |
173 | Wire.write((uint8_t)d); // write data hibyte |
174 | Wire.write(temp); // write data lobyte; |
175 | #else |
176 | Wire.send(a); // sends register address to read from |
177 | Wire.send((uint8_t)d); // write data hibyte |
178 | Wire.send(temp); // write data lobyte; |
179 | #endif |
180 |
181 | Wire.endTransmission(); // end transmission |
182 | delay(1); |
183 | } |
184 |
185 |
186 | int16_t INA219::read16(uint8_t a) { |
187 | uint16_t ret; |
188 |
189 | // move the pointer to reg. of interest, null argument |
190 | write16(a, 0); |
191 | |
192 | Wire.requestFrom(( int )i2c_address, 2); // request 2 data bytes |
193 |
194 | #if ARDUINO >= 100 |
195 | ret = Wire.read(); // rx hi byte |
196 | ret <<= 8; |
197 | ret |= Wire.read(); // rx lo byte |
198 | #else |
199 | ret = Wire.receive(); // rx hi byte |
200 | ret <<= 8; |
201 | ret |= Wire.receive(); // rx lo byte |
202 | #endif |
203 |
204 | Wire.endTransmission(); // end transmission |
205 |
206 | return ret; |
207 | } |
Схема генератора:
Внешний и внутренний вид генератора:
Привет, по моему этот генерато никчемная вещь. Посмотрел отзовы на ютьюбе, это тоже самое что и генератор свободной энергии, не трать напрасно свое время и нас всякой ерундой не грузи!
Привет, по моему этот генерато никчемная вещь. Посмотрел отзовы на ютьюбе, это тоже самое что и генератор свободной энергии, не трать напрасно свое время и нас всякой ерундой не грузи!
у меня на руках объективные данные СКТ (в динамике), они говорят совершенно о другом, дай Бог чтобы вам он никогда не понадобился!
А мне нравится идея, хочу повторить только на dds генераторе
А мне нравится идея, хочу повторить только на dds генераторе
Уже, только на макетной плате, до разработки новой платы руки еще не дошли, непонятно насколько высоко можно гнать по частоте от 300кГц, катушек пока не делалось, но датчик резонанса тот же )))
Заказал модуль на ad9833, усилитель останется на tda7056. Уже руки чешутся все собрать и проверить. А зачем высоко гнать по частоте, там же рабочий диапазон 300+-50 кГц
Хотел спросить, а в какую цепь вы включали датчик тока, он ведь измеряет падение постоянного напряжения, а на катушке переменка. Я ставил в цепь питания микросхемы усилителя, делал на тда7297.
Есть продвижки?
Схема интересная!
Есть продвижки?
Схема интересная!
Устройство реализовано!!!
В тех же габаритах сделана плата процессора и на PIC контроллере, программа на ассемблере.
То-есть, можно применить либо ардуино нано либо самодельный контроллер не меня ничего в приборе.
Думаю пик в данном случае более уместен!!!
Хотел спросить, а в какую цепь вы включали датчик тока, он ведь измеряет падение постоянного напряжения, а на катушке переменка. Я ставил в цепь питания микросхемы усилителя, делал на тда7297.
Основным потребителем тока в этой схеме является микросхема TDA-7056 поэтому меряю общий ток потребления, на резонансе он максимальный и равен при 9 вольтах питания порядка одного ампера, если микросхема исправна, на неисправной - вдвое меньше. На неисправной на осциллограмме питающего тока отсутствует тот эффект которому Мишин дал название эмплозия ))) (эффект перезаряда емкости контура)
Катушка - последовательный колебательный контур, эквивалентное сопротивление на частоте резонанса получилось порядка двух ом.
Думаю пик в данном случае более уместен!!!
На пике другой алгоритм поиска резонанса, другой автор программы, делает это медленнее чем на ардуино...
Ждёмс, может кто предложит свой алгоритм поиска резонанса, так как железо по своему составу оптимально )))
Сейчас ведутся работы по генератору на ADхх33 что позволит подключать любые катушки с неизвестной резонансной частотой
По распиновке и размерам PIC уложен в конструктив ардуино нано ))) то-есть лёгким движением руки...превращается )))
Ну хоть что-нибудь опубликуйте. Спасибо за труд!
Как я и говорил пустая трата времени. Это из тойже оперы что и поиск "свободной энергии"
Так основа опубликова выше, там указан режим измерения INA219 ну и библиотеки для работы с оной, далее измеряем, сравниваем, корректируем. На Пик контроллере нет аппаратного I2C, реализован программно.
Алгоритм обсуждался здесь
Как я и говорил пустая трата времени. Это из тойже оперы что и поиск "свободной энергии"
а при чём здесь свободная энергия?
Аналогичный прибор сделан в Израиле как медицинский прибор, называется M1F, сертифицирован минздравом USA на лечение онкологии.
Исследования велись давно, не могу сказать, что Мишин не позаимствовал идеи этих исследований.
Только по частотам он значительно шире...
Так основа опубликова выше, там указан режим измерения INA219 ну и библиотеки для работы с оной, далее измеряем, сравниваем, корректируем. На Пик контроллере нет аппаратного I2C, реализован программно.
Алгоритм обсуждался здесь
Я ещё ардуинами не пользовался. Было бы не плохо увидеть схему целиком. Ну про платы....было бы сказочно просто. Может много хочу, ну как есть. Заранее благодарен.
Так основа опубликова выше, там указан режим измерения INA219 ну и библиотеки для работы с оной, далее измеряем, сравниваем, корректируем. На Пик контроллере нет аппаратного I2C, реализован программно.
Алгоритм обсуждался здесь
Я ещё ардуинами не пользовался. Было бы не плохо увидеть схему целиком. Ну про платы....было бы сказочно просто. Может много хочу, ну как есть. Заранее благодарен.
Для этого надо сесть и специально этим заняться, к сожалению времени нет. Была надежда, что к проекту подключатся более компетентные программеры и реализуют свои познания на профессиональном уровне )))
Видимо никого не заинтересовал сей девайс.
Платы делались в Pcad так что доступен только формат pcb.
Да и повторять один к одному как-то не интересно.
PS можно купить готовое изделие, предложений масса, да и по цене будет дешевле, но из исследованных мной генераторов ни один не работает в режиме стоячей волны, все в режиме бегущей волны, то-есть катушка работает не на своей резонансной частоте. Да и на осциллограмме "провальчика" нет.
Здесь реализована классика - именно тот режим, что публиковал Мишин в первых своих постах на Ютубе.
Ну хозяин барин. В любом случае, спасибо. А тех кого не заинтересовал, им сильно в голову вбили научную догму. Каждому своё.
Я делал на макетке схему, плюс датчик тока и усилитель TDA 7294
Только еще подключал датчик тока по I2C и в ручном режиме смотрел показания тока потребления микросхемы усилителя.
Максимум тока найти не проблема. А вот в автоматическом режиме перебор частот получается очень медленный и чем меньше значение шага, тем медленнее поиск максимума тока.
Если кому нужет мой кривой скетч, могу выложить. И ручной генератор и с автоматической перестройкой с 270 кГц до 350кГц
Я делал на макетке схему, плюс датчик тока и усилитель TDA 7294
Только еще подключал датчик тока по I2C и в ручном режиме смотрел показания тока потребления микросхемы усилителя.
Максимум тока найти не проблема. А вот в автоматическом режиме перебор частот получается очень медленный и чем меньше значение шага, тем медленнее поиск максимума тока.
Если кому нужет мой кривой скетч, могу выложить. И ручной генератор и с автоматической перестройкой с 270 кГц до 350кГц
Выкладывай, посмотрю почему у тебя перебор частот медленный, у меня алгоритм двухпроходный, поправлю, но посмотреть не на чем, у меня AD9850,а она по другому программируется
Да, интересует напряжение питания и каков ток микросхемы. Еще виден ли на осциллограмме провал, так как на этой диаграмме . Естественно в точке питания контура
Если снимать осциллограмку с виточка, то естественно чистейшая синусоида
Оригинальная схема и код видимо брались здесь?
просто предмет сей не входит в круг их понятий...
Обоснований то масса, но что истина ведает только абсолют...
Самое главное, что есть эффект!
Вот схема по которой собирал. А скетч взял с http://edycube.blog.fc2.com/blog-entry-933.html. Вечером выложу свой скетч. По току питания усилителя могу сказать, что максимум был 130 мА мне показалось как-то маловато. Возможно микросхема усилителя брак, так как цена была рублей 5 за штуку
Здорово, жду скетч.
Заранее благодарен!!!
Если верить этому даташиту эта микросхема для этих целей не подходит,
Правильная TDA7056 наше всё.
Есть микросхемы для модемов VDSL но я их еще не пытал, размах ножек мелковат для лута.
Код содран у англичанина
1
const
int
SINE = 0x2000;
// Define AD9833's waveform register value.
2
const
int
SQUARE = 0x2028;
// When we update the frequency, we need to
3
const
int
TRIANGLE = 0x2002;
// define the waveform when we end writing.
Ну не может жеж пояснение совпадать до буковки )))
Я использовал не 7294, а TDA 7297. И хоть у нее и стоит предел в 300кГц, но видимо она не тянет их, как и некоторые TDA7056. Собрал макетку по схеме "Дена"для проверки микросхемы, работает отлично, ток выставлял до 500мА. Делаю сейчас плату под выложенную мной схему с TDA7056 и енкодерами, посмотрим как пойдет, надеюсь жена не выгонет из дома.
Я скетч подсмотрел на китайском сайте, а уж откуда там передрали фиг знает
Вот мой код. Автоподстройка частоты по току питания усилителя, енкодеры не задействованы.
001
#include <Rotary.h>
002
#include <SPI.h>
003
#include <Wire.h>
004
#include <LiquidCrystal_I2C.h>
005
#include <Adafruit_INA219.h>
006
007
Adafruit_INA219 ina219;
008
009
// Set the LCD address to 0x27 for a 16 chars and 2 line display
010
LiquidCrystal_I2C lcd(0x27, 20, 4);
011
012
const
int
SINE = 0x2000;
// Define AD9833's waveform register value.
013
const
int
SQUARE = 0x2020;
// When we update the frequency, we need to
014
const
int
TRIANGLE = 0x2002;
// define the waveform when we end writing.
015
016
int
wave = 0;
017
int
waveType = SINE;
018
int
wavePin = 7;
019
int
freqUpPin = 2;
// Define rotary encoder pins.
020
int
freqDownPin = 3;
021
int
stepUpPin = 5;
022
int
stepDownPin = 6;
023
int
current_mA_OLD = 0;
024
int
maxFreq = 0;
025
const
float
refFreq = 25000000.0;
// On-board crystal reference frequency
026
027
const
int
FSYNC = 10;
// Standard SPI pins for the AD9833 waveform generator.
028
const
int
CLK = 13;
// CLK and DATA pins are shared with the TFT display.
029
const
int
DATA = 11;
030
031
Rotary r = Rotary(freqUpPin, freqDownPin);
// Rotary encoder for frequency connects to interrupt pins
032
Rotary i = Rotary(stepUpPin, stepDownPin);
// Rotart encoder for setting increment.
033
034
long
freq = 300000;
// Set initial frequency.
035
long
freqOld = freq;
036
037
long
incr = 1000;
038
long
oldIncr = 1000;
039
char
disp_buf[16];
040
041
char
* formText[3] = {
042
" SINE"
,
043
" SQUARE"
,
044
" TRIANGLE"
,
045
};
046
047
char
* stepText[18] = {
048
" 1Hz"
,
049
" 2Hz"
,
050
" 5Hz"
,
051
" 10Hz"
,
052
" 20Hz"
,
053
" 50Hz"
,
054
" 100Hz"
,
055
" 200Hz"
,
056
" 500Hz"
,
057
" 1,000Hz"
,
058
" 2,000Hz"
,
059
" 5,000Hz"
,
060
" 10,000Hz"
,
061
" 20,000Hz"
,
062
" 50,000Hz"
,
063
" 100,000Hz"
,
064
" 200,000Hz"
,
065
" 500,000Hz"
066
};
067
068
int
stepPointer = 6;
069
//long incr = 0;
070
String units = stepText[stepPointer];
071
String form = formText[wave];
072
073
void
setup
() {
074
075
Serial
.begin(9600);
076
uint32_t currentFrequency;
077
078
Serial
.println(
"Hello!"
);
079
080
// Initialize the INA219.
081
// By default the initialization will use the largest range (32V, 2A). However
082
// you can call a setCalibration function to change this range (see comments).
083
ina219.begin(0x40);
084
// To use a slightly lower 32V, 1A range (higher precision on amps):
085
ina219.setCalibration_32V_1A();
086
// Or to use a lower 16V, 400mA range (higher precision on volts and amps):
087
//ina219.setCalibration_16V_400mA();
088
089
Serial
.println(
"Measuring voltage and current with INA219 ..."
);
090
091
pinMode(freqUpPin, INPUT_PULLUP);
// Set pins for rotary encoders as INPUTS and enable
092
pinMode(freqDownPin, INPUT_PULLUP);
// internal pullup resistors.
093
pinMode(stepUpPin, INPUT_PULLUP);
094
pinMode(stepDownPin, INPUT_PULLUP);
095
pinMode(wavePin, INPUT_PULLUP);
096
097
// Configure interrupt and enable for rotary encoder.
098
PCICR |= (1 << PCIE2);
099
PCMSK2 |= (1 << PCINT18) | (1 << PCINT19);
100
sei();
101
SPI.begin();
102
delay(50);
103
104
lcd.init();
105
lcd.backlight();
106
lcd.clear();
//
107
lcd.setCursor( 0, 0 );
108
lcd.print(
"AD9833"
);
109
lcd.setCursor( 0, 1 );
110
lcd.print(
"Signal Generator"
);
111
delay(1000);
112
lcd.clear();
113
114
AD9833reset();
// Reset AD9833 module after power-up.
115
delay(50);
116
AD9833setFrequency(freq, SINE);
// Set the frequency and Sine Wave output
117
updateDisplay();
118
119
}
120
121
void
getStep() {
122
switch
(stepPointer) {
123
case
0: incr = 1;
break
;
124
case
1: incr = 2;
break
;
125
case
2: incr = 5;
break
;
126
case
3: incr = 10;
break
;
127
case
4: incr = 20;
break
;
128
case
5: incr = 50;
break
;
129
case
6: incr = 100;
break
;
130
case
7: incr = 200;
break
;
131
case
8: incr = 500;
break
;
132
case
9: incr = 1000;
break
;
133
case
10: incr = 2000;
break
;
134
case
11: incr = 5000;
break
;
135
case
12: incr = 10000;
break
;
136
case
13: incr = 20000;
break
;
137
case
14: incr = 50000;
break
;
138
case
15: incr = 100000;
break
;
139
case
16: incr = 200000;
break
;
140
case
17: incr = 500000;
break
;
141
}
142
}
143
144
void
updateDisplay() {
145
getStep();
146
units = stepText[stepPointer];
147
//lcd.clear();
148
lcd.setCursor( 0, 0 );
149
lcd.print(
"STEP: "
);
150
lcd.print(units );
151
152
lcd.setCursor( 0, 1 );
153
lcd.print(
"FRQ:"
);
154
if
(freq < 1000) {
155
sprintf(disp_buf,
"%10ld"
, freq);
156
}
157
else
if
(freq < 1000000) {
158
int
freqL = freq % 1000;
159
int
freqM = freq / 1000;
160
sprintf(disp_buf,
"%6d,%03d"
, freqM, freqL);
161
}
162
else
{
163
int
freqL = freq % 1000;
164
int
freqM = (freq / 1000) % 1000;
165
int
freqH = freq / 1000000;
166
sprintf(disp_buf,
"%2d,%03d,%03d"
, freqH, freqM, freqL);
167
}
168
lcd.print(disp_buf);
169
lcd.print(
"Hz"
);
170
171
form = formText[wave];
172
lcd.setCursor( 0, 2 );
173
lcd.print(
"FORM: "
);
174
lcd.print(form );
175
176
177
178
}
179
180
void
loop
() {
181
182
float
shuntvoltage = 0;
183
float
busvoltage = 0;
184
float
current_mA = 0;
185
float
loadvoltage = 0;
186
187
shuntvoltage = ina219.getShuntVoltage_mV();
188
busvoltage = ina219.getBusVoltage_V();
189
current_mA = ina219.getCurrent_mA();
190
loadvoltage = busvoltage + (shuntvoltage / 1000);
191
192
Serial
.print(
"Bus Voltage: "
);
Serial
.print(busvoltage);
Serial
.println(
" V"
);
193
Serial
.print(
"Shunt Voltage: "
);
Serial
.print(shuntvoltage);
Serial
.println(
" mV"
);
194
Serial
.print(
"Load Voltage: "
);
Serial
.print(loadvoltage);
Serial
.println(
" V"
);
195
Serial
.print(
"Current: "
);
Serial
.print(current_mA);
Serial
.println(
" mA"
);
196
Serial
.println(
""
);
197
lcd.setCursor( 0, 3 );
198
lcd.print(
"Current: "
);
199
lcd.print(round(current_mA));
200
lcd.print(
"mA"
);
201
202
if
(oldIncr != incr) {
203
updateDisplay();
204
oldIncr = incr;
205
}
206
// Check if push button on 'increment' rotary encoder is pushed and set Wave Type accordingly.
207
if
(digitalRead(wavePin) == LOW) {
208
wave += 1;
209
if
(wave > 2) wave = 0;
210
switch
(wave) {
211
case
0: waveType = SINE;
break
;
212
case
1: waveType = SQUARE;
break
;
213
case
2: waveType = TRIANGLE;
break
;
214
}
215
// AD9833setFrequency(freq, waveType); // Set AD9833 to frequency and selected wave type.
216
// updateDisplay();
217
//delay(200);
218
}
219
if
(current_mA <= current_mA_OLD-4){
220
freq = 300000;
221
current_mA_OLD =0;
222
}
223
if
((current_mA) >= current_mA_OLD) {
224
225
if
((freq + incr) <= 350000) freq += incr;
226
current_mA_OLD = current_mA;
227
maxFreq = freq;
228
if
(freq <= 300000) freq = 300000;
229
if
(freq >= 350000) freq = 350000;
230
//delay(10);
231
if
(freq != freqOld) {
// If frequency has changed, interrupt rotary encoder
232
AD9833setFrequency(freq, waveType);
// must have been turned so update AD9833 and display.
233
updateDisplay();
234
freqOld = freq;
// Remember new frequency to avoid unwanted display
235
}
// and AD9833 updates.
236
}
237
}
238
// AD9833 documentation advises a 'Reset' on first applying power.
239
void
AD9833reset() {
240
WriteRegister(0x100);
// Write '1' to AD9833 Control register bit D8.
241
delay(10);
242
}
243
244
245
246
// Set the frequency and waveform registers in the AD9833.
247
void
AD9833setFrequency(
long
frequency,
int
Waveform) {
248
249
long
FreqWord = (frequency * pow(2, 28)) / refFreq;
250
251
int
MSB = (
int
)((FreqWord & 0xFFFC000) >> 14);
//Only lower 14 bits are used for data
252
int
LSB = (
int
)(FreqWord & 0x3FFF);
253
254
//Set control bits 15 ande 14 to 0 and 1, respectively, for frequency register 0
255
LSB |= 0x4000;
256
MSB |= 0x4000;
257
258
WriteRegister(0x2100);
259
WriteRegister(LSB);
// Write lower 16 bits to AD9833 registers
260
WriteRegister(MSB);
// Write upper 16 bits to AD9833 registers.
261
WriteRegister(0xC000);
// Phase register
262
WriteRegister(Waveform);
// Exit & Reset to SINE, SQUARE or TRIANGLE
263
264
}
265
void
WriteRegister(
int
dat) {
266
267
// Display and AD9833 use different SPI MODES so it has to be set for the AD9833 here.
268
SPI.setDataMode(SPI_MODE2);
269
270
digitalWrite(FSYNC, LOW);
// Set FSYNC low before writing to AD9833 registers
271
delayMicroseconds(10);
// Give AD9833 time to get ready to receive data.
272
273
SPI.transfer(highByte(dat));
// Each AD9833 register is 32 bits wide and each 16
274
SPI.transfer(lowByte(dat));
// bits has to be transferred as 2 x 8-bit bytes.
275
276
digitalWrite(FSYNC, HIGH);
//Write done. Set FSYNC high
277
}
Вот мой код. Автоподстройка частоты по току питания усилителя, енкодеры не задействованы.
нет ребята, всё не так, всё не так ребята )))
1. Надо определиться с полосой пропускания самой катушки по уровню к примеру 0,5, если есть генератор померь
2. Шагать надо с шагом равным полосе пропускания от нижней частоты до верхней к примеру от 250Кгц до 350Кгц
3. Как только на следующем шаге ток начинает падать, останавливаем и запоминаем эту частоту и вносим новые значения Fmin и Fmax и запускаем второй проход определения резонансной частоты, к примеру с шагом 500 герц, находим экстремум, выставляем частоту
С режимом первичной настройки всё
А вот дальше процедура удержания.
Процедуру первичной установки частоты вынести в setup.
С этими библиотеками INA219 я не экспериментировал, с теми что работал библиотеки есть в посте, там же и процедура настройки датчика тока
Насчет супруги не переживай, катушка очень хорошо и быстро снимает любую депрессию )))
Прямо тут и начну делать скетч!
ПРОСЬБА НЕ ЦИТИРОВАТЬ!!!
001
/*
002
* Генератор для катушки Мишина на AD9833 + TDA7056B + INA219
003
* V1.00 - 08.02.2018 стартуем
004
* V1.01 - 09.02.2018 добавлен дисплей LCD 2004A (1602A)
005
*/
006
007
#include <Wire.h>
008
#include <SPI.h>
009
#include <Wire.h>
010
011
#include "LiquidCrystal_I2C.h"
012
LiquidCrystal_I2C lcd(0x27, 20, 4);
// Для экрана 20х4 (четырехстрочный), I2C адрес дисплея уточнить
013
//LiquidCrystal_I2C lcd(0x27, 16, 2); // Для экрана 16х2 (двухстрочный)
014
015
#include "ina219.h"
016
INA219 monitor;
017
unsigned
int
imax = 0;
018
unsigned
int
Data_ina219 = 0;
019
020
const
int
SINE = 0x2000;
// определяем значение регистров AD9833 взависимости от формы сигнала
021
const
int
SQUARE = 0x2020;
// После обновления частоты нужно определить форму сигнала
022
const
int
TRIANGLE = 0x2002;
// и произвести запись в регистр.
023
024
/*
025
int wave = 0;
026
int waveType = SINE;
027
int wavePin = 7;
028
int freqUpPin = 2; // Define rotary encoder pins. (оставим на будущее)
029
int freqDownPin = 3;
030
int stepUpPin = 5;
031
int stepDownPin = 6;
032
int current_mA_OLD = 0;
033
int maxFreq = 0;
034
*/
035
036
const
float
refFreq = 25000000.0;
// On-board crystal reference frequency
037
038
long
Fmin = 200000;
039
long
Fmax = 350000;
040
long
FFmax = 0;
041
long
freq = Fmin;
042
long
ifreq = 0;
043
int
Ftune = 10000;
044
int
Ffinetune = 500;
045
046
const
int
FSYNC = 10;
// Standard SPI pins for the AD9833 waveform generator.
047
const
int
CLK = 13;
// CLK and DATA pins are shared with the TFT display.
048
const
int
DATA = 11;
049
050
/*** Процедура записи в регистры управления микросхемы AD9833 ***/
051
void
WriteRegister(
int
dat) {
052
053
// Обычно дисплеи и микросхема AD9833 испоьзуют различные режимы SPI поэтому требуемый
054
// для AD9833 режим работы SPI должен быть установлен здесь.
055
SPI.setDataMode(SPI_MODE2);
056
057
digitalWrite(FSYNC, LOW);
// Set FSYNC low before writing to AD9833 registers
058
delayMicroseconds(10);
// Give AD9833 time to get ready to receive data.
059
060
SPI.transfer(highByte(dat));
// Each AD9833 register is 32 bits wide and each 16
061
SPI.transfer(lowByte(dat));
// bits has to be transferred as 2 x 8-bit bytes.
062
063
digitalWrite(FSYNC, HIGH);
//Write done. Set FSYNC high
064
}
065
066
/*** Процедура RESET микросхемы AD9833 - должна выполняться после включения питания ***/
067
void
AD9833reset() {
068
WriteRegister(0x100);
// Write '1' to AD9833 Control register bit D8.
069
delay(10);
070
}
071
072
073
/*** Процедура установки частоты и формы сигнала микросхемы AD9833 ***/
074
void
AD9833setFrequency(
long
frequency,
int
Waveform) {
075
076
long
FreqWord = (frequency * pow(2, 28)) / refFreq;
077
078
int
MSB = (
int
)((FreqWord & 0xFFFC000) >> 14);
//Only lower 14 bits are used for data
079
int
LSB = (
int
)(FreqWord & 0x3FFF);
080
081
//Set control bits 15 ande 14 to 0 and 1, respectively, for frequency register 0
082
LSB |= 0x4000;
083
MSB |= 0x4000;
084
085
WriteRegister(0x2100);
086
WriteRegister(LSB);
// Write lower 16 bits to AD9833 registers
087
WriteRegister(MSB);
// Write upper 16 bits to AD9833 registers.
088
WriteRegister(0xC000);
// Phase register
089
WriteRegister(Waveform);
// Exit & Reset to SINE, SQUARE or TRIANGLE
090
091
}
092
093
094
095
/************************** SETUP *************************/
096
void
setup
() {
097
SPI.begin();
098
AD9833reset();
// Reset AD9833 module after power-up.
099
100
Serial
.begin(9600);
101
lcd.begin();
102
digitalWrite(8, LOW);
103
monitor.begin(64);
// i2c address 64=0x40
104
// monitor.configure(0, 2, 10, 10, 7); // 4S -2.13ms
105
// monitor.configure(0, 2, 11, 11, 7); // 8S -4.26ms
106
// monitor.configure(0, 2, 12, 12, 7); // 16S -8.51ms
107
// monitor.configure(0, 2, 13, 13, 7); // 32S -17.02ms
108
// monitor.configure(0, 2, 14, 14, 7); // 64S - 34.05ms
109
monitor.configure(0, 2, 15, 15, 7);
// 128S - 68.10ms
110
// monitor.configure(0, 2, 8, 8, 7);
111
// range, gain, bus_adc, shunt_adc, mode
112
// range = 1 (0-32V bus voltage range)
113
// gain = 3 (1/8 gain - 320mV range)
114
// bus adc = 3 (12-bit, single sample, 532uS conversion time)
115
// shunt adc = 3 (12-bit, single sample, 532uS conversion time)
116
// mode = 7 (continuous conversion)
117
monitor.calibrate(0.100, 0.32, 16, 3.2);
118
// R_шунта, напряж_шунта, макcнапряж, максток
119
120
delay(10);
121
// AD9833reset(); // Reset AD9833 module after power-up.
122
delay(50);
123
124
AD9833setFrequency(freq, SINE);
// выставляем нижнюю частоту
125
126
for
(
int
i=1; i <= 15; i++) {
127
Data_ina219=monitor.shuntCurrent() * 1000;
128
if
(Data_ina219 > imax){ imax=Data_ina219; ifreq = freq; }
// Если значение больше, то запомнить
129
freq=freq+Ftune;
130
if
(freq >=Fmax) {freq = Fmax;}
131
AD9833setFrequency(freq, SINE);
132
delay(70);
133
}
134
freq = ifreq-10000;
135
FFmax =ifreq +10000;
136
imax = 0;
137
AD9833setFrequency(freq, SINE);
// Set the frequency and Sine Wave output
138
for
(
int
j=1; j <= 40; j++) {
139
Data_ina219=monitor.shuntCurrent() * 1000;
140
if
(Data_ina219 > imax){ imax=Data_ina219; ifreq = freq; }
// Если значение больше, то запомнить
141
freq=freq+Ffinetune;
142
if
(freq >=FFmax) {freq = FFmax;}
143
AD9833setFrequency(freq, SINE);
144
delay(2);
145
146
}
147
Data_ina219=monitor.shuntCurrent() * 1000;
148
lcd.setCursor(0, 0);
// 1 строка
149
lcd.print(
"GENERATOR MPGSP-V1.0"
);
150
lcd.setCursor(0, 1);
// 2 строка
151
lcd.print(
"Freq = "
);
152
lcd.setCursor(0, 2);
// 3 строка
153
lcd.print(freq);
154
lcd.setCursor(0, 3);
// 4 строка
155
lcd.print(
"TOK = "
);
156
lcd.setCursor(7, 3);
// 4 строка 7 позиция
157
lcd.print(Data_ina219);
158
}
// Конец процедуры инициализации прибора
159
160
void
loop
() {
161
162
}
Используемые библиотеки:
INA219.h
001
/******************************************************************************
002
* TI INA219 hi-side i2c current/power monitor Library
003
*
004
* <a href="<a href="http://www.ti.com/product/ina219" rel="nofollow">http://www.ti.com/product/ina219</a>" title="<a href="http://www.ti.com/product/ina219" rel="nofollow">http://www.ti.com/product/ina219</a>" rel="nofollow"><a href="http://www.ti.com/product/ina219" rel="nofollow">http://www.ti.com/product/ina219</a></a>
005
*
006
* 6 May 2012 by John De Cristofaro
007
*
008
*
009
* Tested at standard i2c 100kbps signaling rate.
010
*
011
* This library does not handle triggered conversion modes. It uses the INA219
012
* in continuous conversion mode. All reads are from continous conversions.
013
*
014
* A note about the gain (PGA) setting:
015
* The gain of the ADC pre-amplifier is programmable in the INA219, and can
016
* be set between 1/8x (default) and unity. This allows a shunt voltage
017
* range of +/-320mV to +/-40mV respectively. Something to keep in mind,
018
* however, is that this change in gain DOES NOT affect the resolution
019
* of the ADC, which is fixed at 1uV. What it does do is increase noise
020
* immunity by exploiting the integrative nature of the delta-sigma ADC.
021
* For the best possible reading, you should set the gain to the range
022
* of voltages that you expect to see in your particular circuit. See
023
* page 15 in the datasheet for more info about the PGA.
024
*
025
* Known bugs:
026
* * may return unreliable values if not connected to a bus or at
027
* bus currents below 10uA.
028
*
029
* Arduino 1.0 compatible as of 6/6/2012
030
*
031
* Dependencies:
032
* * Arduino Wire library
033
*
034
* MIT license
035
******************************************************************************/
036
037
#ifndef ina219_h
038
#define ina219_h
039
040
041
#if ARDUINO >= 100
042
#include "Arduino.h"
043
#else
044
#include "WProgram.h"
045
#endif
046
047
#include <Wire.h>
048
049
#define INA219_DEBUG 1
050
051
// INA219 memory registers
052
#define CONFIG_R 0x00 // configuration register
053
#define V_SHUNT_R 0x01 // differential shunt voltage
054
#define V_BUS_R 0x02 // bus voltage (wrt to system/chip GND)
055
#define P_BUS_R 0x03 // system power draw (= V_BUS * I_SHUNT)
056
#define I_SHUNT_R 0x04 // shunt current
057
#define CAL_R 0x05 // calibration register
058
059
#define INA_RESET 0xFFFF // send to CONFIG_R to reset unit
060
061
#define CONFIG_DEFAULT 0x399F
062
063
// config. register bit labels
064
#define RST 15
065
#define BRNG 13
066
#define PG1 12
067
#define PG0 11
068
#define BADC4 10
069
#define BADC3 9
070
#define BADC2 8
071
#define BADC1 7
072
#define SADC4 6
073
#define SADC3 5
074
#define SADC2 4
075
#define SADC1 3
076
#define MODE3 2
077
#define MODE2 1
078
#define MODE1 0
079
080
// default values
081
#define D_I2C_ADDRESS 0x40 // (64)
082
#define D_RANGE 1
083
#define D_GAIN 3
084
#define D_SHUNT_ADC 3
085
#define D_BUS_ADC 3
086
#define D_MODE 7
087
#define D_SHUNT 0.25
088
#define D_V_BUS_MAX 6
089
#define D_V_SHUNT_MAX 0.3
090
#define D_I_MAX_EXPECTED 1
091
092
093
class
INA219
094
{
095
public
:
096
INA219();
097
098
// by default uses addr = 0x40 (both a-pins tied low)
099
void
begin(uint8_t addr = D_I2C_ADDRESS);
100
101
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);
102
103
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);
104
105
void
reset();
106
107
int16_t shuntVoltageRaw();
108
int16_t busVoltageRaw();
109
float
shuntVoltage();
110
float
busVoltage();
111
float
shuntCurrent();
112
float
busPower();
113
114
115
private
:
116
uint8_t i2c_address;
117
float
r_shunt, current_lsb, power_lsb;
118
uint16_t config, cal, gain;
119
120
int16_t read16(uint8_t addr);
121
void
write16(uint8_t addr, uint16_t data);
122
123
};
124
125
#endif
INA219.cpp
001
/******************************************************************************
002
* TI INA219 hi-side i2c current/power monitor Library
003
*
004
* <a href="<a href="http://www.ti.com/product/ina219" rel="nofollow">http://www.ti.com/product/ina219</a>" title="<a href="http://www.ti.com/product/ina219" rel="nofollow">http://www.ti.com/product/ina219</a>" rel="nofollow"><a href="http://www.ti.com/product/ina219" rel="nofollow">http://www.ti.com/product/ina219</a></a>
005
*
006
* 6 May 2012 by John De Cristofaro
007
*
008
*
009
* Tested at standard i2c 100kbps signaling rate.
010
*
011
* This library does not handle triggered conversion modes. It uses the INA219
012
* in continuous conversion mode. All reads are from continous conversions.
013
*
014
* A note about the gain (PGA) setting:
015
* The gain of the ADC pre-amplifier is programmable in the INA219, and can
016
* be set between 1/8x (default) and unity. This allows a shunt voltage
017
* range of +/-320mV to +/-40mV respectively. Something to keep in mind,
018
* however, is that this change in gain DOES NOT affect the resolution
019
* of the ADC, which is fixed at 1uV. What it does do is increase noise
020
* immunity by exploiting the integrative nature of the delta-sigma ADC.
021
* For the best possible reading, you should set the gain to the range
022
* of voltages that you expect to see in your particular circuit. See
023
* page 15 in the datasheet for more info about the PGA.
024
*
025
* Known bugs:
026
* * may return unreliable values if not connected to a bus or at
027
* bus currents below 10uA.
028
*
029
* Arduino 1.0 compatible as of 6/6/2012
030
*
031
* Dependencies:
032
* * Arduino Wire library
033
*
034
* MIT license
035
******************************************************************************/
036
037
#include "INA219.h"
038
#include <util/delay.h>
039
040
INA219::INA219() {
041
}
042
043
044
void
INA219::begin(uint8_t addr)
045
{
046
Wire.begin();
047
i2c_address = addr;
048
gain = D_GAIN;
049
}
050
051
052
// calibration of equations and device
053
// shunt_val = value of shunt in Ohms
054
// v_shunt_max = maximum value of voltage across shunt
055
// v_bus_max = maximum voltage of bus
056
// i_max_expected = maximum current draw of bus + shunt
057
// default values are for a 0.25 Ohm shunt on a 5V bus with max current of 1A
058
void
INA219::calibrate(
float
shunt_val,
float
v_shunt_max,
float
v_bus_max,
float
i_max_expected)
059
{
060
uint16_t cal;
061
float
i_max_possible, min_lsb, max_lsb, swap;
062
063
r_shunt = shunt_val;
064
065
i_max_possible = v_shunt_max / r_shunt;
066
min_lsb = i_max_expected / 32767;
067
max_lsb = i_max_expected / 4096;
068
069
current_lsb = (uint16_t)(min_lsb * 100000000) + 1;
070
current_lsb /= 100000000;
071
swap = (0.04096)/(current_lsb*r_shunt);
072
cal = (uint16_t)swap;
073
power_lsb = current_lsb * 20;
074
075
#if (INA219_DEBUG == 1)
076
Serial
.print(
"v_bus_max: "
);
Serial
.println(v_bus_max, 8);
077
Serial
.print(
"v_shunt_max: "
);
Serial
.println(v_shunt_max, 8);
078
Serial
.print(
"i_max_possible: "
);
Serial
.println(i_max_possible, 8);
079
Serial
.print(
"i_max_expected: "
);
Serial
.println(i_max_expected, 8);
080
Serial
.print(
"min_lsb: "
);
Serial
.println(min_lsb, 12);
081
Serial
.print(
"max_lsb: "
);
Serial
.println(max_lsb, 12);
082
Serial
.print(
"current_lsb: "
);
Serial
.println(current_lsb, 12);
083
Serial
.print(
"power_lsb: "
);
Serial
.println(power_lsb, 8);
084
Serial
.println(
" "
);
085
Serial
.print(
"cal: "
);
Serial
.println(cal);
086
Serial
.print(
"r_shunt: "
);
Serial
.println(r_shunt);
087
#endif
088
089
write16(CAL_R, cal);
090
091
}
092
093
094
// config values (range, gain, bus adc, shunt adc, mode) can be derived from pp26-27 in the datasheet
095
// defaults are:
096
// range = 1 (0-32V bus voltage range)
097
// gain = 3 (1/8 gain - 320mV range)
098
// bus adc = 3 (12-bit, single sample, 532uS conversion time)
099
// shunt adc = 3 (12-bit, single sample, 532uS conversion time)
100
// mode = 7 (continuous conversion)
101
void
INA219::configure(uint8_t range, uint8_t gain, uint8_t bus_adc, uint8_t shunt_adc, uint8_t mode)
102
{
103
config = 0;
104
105
config |= (range << BRNG | gain << PG0 | bus_adc << BADC1 | shunt_adc << SADC1 | mode);
106
107
write16(CONFIG_R, config);
108
}
109
110
// resets the INA219
111
void
INA219::reset()
112
{
113
write16(CONFIG_R, INA_RESET);
114
_delay_ms(5);
115
}
116
117
// returns the raw binary value of the shunt voltage
118
int16_t INA219::shuntVoltageRaw()
119
{
120
return
read16(V_SHUNT_R);
121
}
122
123
// returns the shunt voltage in volts.
124
float
INA219::shuntVoltage()
125
{
126
float
temp;
127
temp = read16(V_SHUNT_R);
128
return
(temp / 100000);
129
}
130
131
// returns raw bus voltage binary value
132
int16_t INA219::busVoltageRaw()
133
{
134
return
read16(V_BUS_R);
135
}
136
137
// returns the bus voltage in volts
138
float
INA219::busVoltage()
139
{
140
int16_t temp;
141
temp = read16(V_BUS_R);
142
temp >>= 3;
143
return
(temp * 0.004);
144
}
145
146
// returns the shunt current in amps
147
float
INA219::shuntCurrent()
148
{
149
return
(read16(I_SHUNT_R) * current_lsb);
150
}
151
152
// returns the bus power in watts
153
float
INA219::busPower()
154
{
155
return
(read16(P_BUS_R) * power_lsb);
156
}
157
158
159
/**********************************************************************
160
* INTERNAL I2C FUNCTIONS *
161
**********************************************************************/
162
163
// writes a 16-bit word (d) to register pointer (a)
164
// when selecting a register pointer to read from, (d) = 0
165
void
INA219::write16(uint8_t a, uint16_t d) {
166
uint8_t temp;
167
temp = (uint8_t)d;
168
d >>= 8;
169
Wire.beginTransmission(i2c_address);
// start transmission to device
170
171
#if ARDUINO >= 100
172
Wire.write(a);
// sends register address to read from
173
Wire.write((uint8_t)d);
// write data hibyte
174
Wire.write(temp);
// write data lobyte;
175
#else
176
Wire.send(a);
// sends register address to read from
177
Wire.send((uint8_t)d);
// write data hibyte
178
Wire.send(temp);
// write data lobyte;
179
#endif
180
181
Wire.endTransmission();
// end transmission
182
delay(1);
183
}
184
185
186
int16_t INA219::read16(uint8_t a) {
187
uint16_t ret;
188
189
// move the pointer to reg. of interest, null argument
190
write16(a, 0);
191
192
Wire.requestFrom((
int
)i2c_address, 2);
// request 2 data bytes
193
194
#if ARDUINO >= 100
195
ret = Wire.read();
// rx hi byte
196
ret <<= 8;
197
ret |= Wire.read();
// rx lo byte
198
#else
199
ret = Wire.receive();
// rx hi byte
200
ret <<= 8;
201
ret |= Wire.receive();
// rx lo byte
202
#endif
203
204
Wire.endTransmission();
// end transmission
205
206
return
ret;
207
}
Все сторонние библиотеки включаем в тело проекта, находиться будут файлами в папке проекта

Скетч сканера портов I2C:
01
// --------------------------------------
02
// i2c_scanner
03
//
04
// Version 1
05
// This program (or code that looks like it)
06
// can be found in many places.
07
// For example on the Arduino.cc forum.
08
// The original author is not know.
09
// Version 2, Juni 2012, Using Arduino 1.0.1
10
// Adapted to be as simple as possible by Arduino.cc user Krodal
11
// Version 3, Feb 26 2013
12
// V3 by louarnold
13
// Version 4, March 3, 2013, Using Arduino 1.0.3
14
// by Arduino.cc user Krodal.
15
// Changes by louarnold removed.
16
// Scanning addresses changed from 0...127 to 1...119,
17
// according to the i2c scanner by Nick Gammon
18
// <a href="<a href="http://www.gammon.com.au/forum/?id=10896" rel="nofollow">http://www.gammon.com.au/forum/?id=10896</a>" title="<a href="http://www.gammon.com.au/forum/?id=10896" rel="nofollow">http://www.gammon.com.au/forum/?id=10896</a>" rel="nofollow"><a href="http://www.gammon.com.au/forum/?id=10896" rel="nofollow">http://www.gammon.com.au/forum/?id=10896</a></a>
19
// Version 5, March 28, 2013
20
// As version 4, but address scans now to 127.
21
// A sensor seems to use address 120.
22
//
23
//
24
// This sketch tests the standard 7-bit addresses
25
// Devices with higher bit address might not be seen properly.
26
//
27
28
#include <Wire.h>
29
30
31
void
setup
()
32
{
33
Wire.begin();
34
35
Serial
.begin(9600);
36
Serial
.println(
"\nI2C Scanner"
);
37
}
38
39
40
void
loop
()
41
{
42
byte
error, address;
43
int
nDevices;
44
45
Serial
.println(
"Scanning..."
);
46
47
nDevices = 0;
48
for
(address = 1; address < 127; address++ )
49
{
50
// The i2c_scanner uses the return value of
51
// the Write.endTransmisstion to see if
52
// a device did acknowledge to the address.
53
Wire.beginTransmission(address);
54
error = Wire.endTransmission();
55
56
if
(error == 0)
57
{
58
Serial
.print(
"I2C device found at address 0x"
);
59
if
(address<16)
60
Serial
.print(
"0"
);
61
Serial
.print(address,HEX);
62
Serial
.println(
" !"
);
63
64
nDevices++;
65
}
66
else
if
(error==4)
67
{
68
Serial
.print(
"Unknow error at address 0x"
);
69
if
(address<16)
70
Serial
.print(
"0"
);
71
Serial
.println(address,HEX);
72
}
73
}
74
if
(nDevices == 0)
75
Serial
.println(
"No I2C devices found\n"
);
76
else
77
Serial
.println(
"done\n"
);
78
79
delay(5000);
// wait 5 seconds for next scan
80
}
откуда брал свою библиотеку для дисплея? включу в тело проекта ту, что подвернулась )))
Про скетч все верно, я и сам понимаю что не то у меня. Библиотека с GITHUB https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library
Буду переделывать
Про скетч все верно, я и сам понимаю что не то у меня. Библиотека с GITHUB https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library
Буду переделывать
Библиотеки заменил на твои, они более свежие, скомпилировалось.
1. Попробуй скетч, библиотеки надо поместить в папку скетча.
2. Если заработает, можешь показать осциллограмму?
PS компилирую на версии 1.8.2 под nano
Про скетч все верно, я и сам понимаю что не то у меня. Библиотека с GITHUB https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library
Буду переделывать
И что со скетчем, работает?
Пока руки не дошли. Все время уходит на зарабатывание денег.
Пока руки не дошли. Все время уходит на зарабатывание денег.
Так там делов на пять минут )))
Попробовал сетч. Компелируется, но после загрузки программа стопается на 118 строке
1
AD9833reset();
До этой строки все выполняется, как доходит, так и останавливается. Смотрел через SerialPrint();
Есть какие мысли?
Есть! Процедура должна выполняться сразу после включения питания. Перетащил ее в первую строку процедуры setup(); #26
Разобрался. В void setup(); нужно было добавить SPI.begin();
Алгоритм мне понятен и все логично, Ишим экстремум грубо, затем отрезок +- 20кГц пробегаем по 500Гц и находим точно максимум. Но нужно усреднять показания тока, слишком быстро меняются значения. По предложенному алгоритму у меня генератор стопается на 230кГц и бывает ещё на 330кГц. А реальная резонансная частота катушки 304кГц. Видимо автонастройка стопается на гармониках. Курим алгоритм дальше
Разобрался. В void setup(); нужно было добавить SPI.begin();
Алгоритм мне понятен и все логично, Ишим экстремум грубо, затем отрезок +- 20кГц пробегаем по 500Гц и находим точно максимум. Но нужно усреднять показания тока, слишком быстро меняются значения. По предложенному алгоритму у меня генератор стопается на 230кГц и бывает ещё на 330кГц. А реальная резонансная частота катушки 304кГц. Видимо автонастройка стопается на гармониках. Курим алгоритм дальше
Поправил в скетче.
INA219 уже работает в режиме расчёта среднего значения, по всей видимости надо подобрать значение режима.
Ненужное закоментируем, нужное - открываем.
Строки 106 и 109 чуток поправил, константу задержки на накопление результата тока - тоже
Спасибо разобрался. Пока пытался заставить работать скетч переписал его на библиотеку Adafruit_INA219.
Короче все заработало ток при резонансе держится на отметке 400 ма. Частота находится за 3 секунды примерно и держится уверенно. Подстройку сделал просто через условие, что если ток питания стал меньше максимального- то запускаем ещё раз цикл поиска ренанса. находится быстро и уверенно.
Осциллографа пока нет и не могу снять форму и фазу тока и напряжения.
От катушки чувствуется тепло если поднести ладонь, пока все
Спасибо разобрался. Пока пытался заставить работать скетч переписал его на библиотеку Adafruit_INA219.
Короче все заработало ток при резонансе держится на отметке 400 ма. Частота находится за 3 секунды примерно и держится уверенно. Подстройку сделал просто через условие, что если ток питания стал меньше максимального- то запускаем ещё раз цикл поиска ренанса. находится быстро и уверенно.
Осциллографа пока нет и не могу снять форму и фазу тока и напряжения.
От катушки чувствуется тепло если поднести ладонь, пока все
скетч в студию
001
#include <Wire.h>
002
#include <SPI.h>
003
#include <Wire.h>
004
#include "LiquidCrystal_I2C.h"
005
LiquidCrystal_I2C lcd(0x27, 20, 4);
// Для экрана 20х4 (четырехстрочный), I2C адрес дисплея уточнить
006
007
#include <Adafruit_INA219.h>
008
Adafruit_INA219 ina219;
009
010
unsigned
int
imax = 0;
011
unsigned
int
Data_ina219 = 0;
012
013
const
int
SINE = 0x2000;
// определяем значение регистров AD9833 взависимости от формы сигнала
014
const
int
SQUARE = 0x2020;
// После обновления частоты нужно определить форму сигнала
015
const
int
TRIANGLE = 0x2002;
// и произвести запись в регистр.
016
017
const
float
refFreq = 25000000.0;
// Частота кристалла на плате AD9833
018
019
long
Fmin = 200000;
020
long
Fmax = 350000;
021
long
FFmax = 0;
022
long
freq = Fmin;
023
long
ifreq = 0;
024
int
Ftune = 10000;
025
int
Ffinetune = 200;
026
027
const
int
FSYNC = 10;
// Standard SPI pins for the AD9833 waveform generator.
028
const
int
CLK = 13;
// CLK and DATA pins are shared with the TFT display.
029
const
int
DATA = 11;
030
031
032
033
/************************** SETUP *************************/
034
void
setup
() {
035
Serial
.begin(9600);
036
lcd.begin();
037
ina219.begin(0x40);
038
ina219.setCalibration_16V_400mA();
039
SPI.begin();
040
041
delay(10);
042
AD9833reset();
// Ресет после включения питания
043
delay(10);
044
045
AD9833setFrequency(freq, SINE);
// выставляем нижнюю частоту
046
047
for
(
int
i=1; i <= 15; i++) {
048
Data_ina219=ina219.getCurrent_mA();
049
if
(Data_ina219 > imax){ imax=Data_ina219; ifreq = freq; }
// Если значение больше, то запомнить
050
if
(freq >=Fmax) {freq = Fmax;}
051
freq=freq+Ftune;
052
AD9833setFrequency(freq, SINE);
053
delay(2);
054
}
055
freq = ifreq-10000;
056
FFmax =ifreq +10000;
057
imax = 0;
058
AD9833setFrequency(freq, SINE);
//
059
for
(
int
j=1; j <= 100; j++) {
060
Data_ina219=ina219.getCurrent_mA();
061
if
(Data_ina219 > imax){ imax=Data_ina219; ifreq = freq; }
// Если значение больше, то запомнить
062
lcd.setCursor(0, 2);
// 2 строка
063
lcd.print(ifreq);
064
freq=freq+Ffinetune;
065
AD9833setFrequency(ifreq, SINE);
066
if
(freq >=FFmax) {freq = FFmax;}
067
Data_ina219=ina219.getCurrent_mA();
068
lcd.setCursor(0, 0);
// 1 строка
069
lcd.print(
"GENERATOR MPGSP-V1.0"
);
070
lcd.setCursor(0, 1);
// 2 строка
071
lcd.print(
"Freq = "
);
072
lcd.print(ifreq);
073
lcd.setCursor(0, 3);
// 4 строка
074
lcd.print(
"TOK = "
);
075
lcd.setCursor(7, 3);
// 4 строка 7 позиция
076
lcd.print(Data_ina219);
077
delay(1);
078
}
079
080
081
}
// Конец процедуры инициализации прибора
082
083
void
loop
() {
084
Data_ina219=ina219.getCurrent_mA();
085
lcd.setCursor(0, 1);
// 2 строка
086
lcd.print(
"Freq = "
);
087
lcd.print(ifreq);
088
lcd.setCursor(0, 3);
// 4 строка
089
lcd.print(
"TOK = "
);
090
lcd.setCursor(7, 3);
// 4 строка 7 позиция
091
lcd.print(Data_ina219);
092
delay(200);
093
if
(Data_ina219 < imax ){
094
095
for
(
int
i=1; i <= 15; i++) {
096
Data_ina219=ina219.getCurrent_mA();
097
if
(Data_ina219 > imax){ imax=Data_ina219; ifreq = freq; }
// Если значение больше, то запомнить
098
if
(freq >=Fmax) {freq = Fmax;}
099
freq=freq+Ftune;
100
AD9833setFrequency(freq, SINE);
101
}
102
freq = ifreq-10000;
103
FFmax =ifreq +10000;
104
imax = 0;
105
AD9833setFrequency(freq, SINE);
// Set the frequency and Sine Wave output
106
for
(
int
j=1; j <= 100; j++) {
107
Data_ina219=ina219.getCurrent_mA();
108
if
(Data_ina219 > imax){ imax=Data_ina219; ifreq = freq; }
// Если значение больше, то запомнить
109
freq=freq+Ffinetune;
110
AD9833setFrequency(ifreq, SINE);
111
if
(freq >=FFmax) {freq = FFmax;}
112
}
113
lcd.clear();
//Очистка дисплея
114
115
}
116
117
}
118
119
// AD9833 documentation advises a 'Reset' on first applying power.
120
void
AD9833reset() {
121
WriteRegister(0x100);
// Write '1' to AD9833 Control register bit D8.
122
delay(10);
123
}
124
125
// Set the frequency and waveform registers in the AD9833.
126
void
AD9833setFrequency(
long
frequency,
int
Waveform) {
127
128
long
FreqWord = (frequency * pow(2, 28)) / refFreq;
129
130
int
MSB = (
int
)((FreqWord & 0xFFFC000) >> 14);
//Only lower 14 bits are used for data
131
int
LSB = (
int
)(FreqWord & 0x3FFF);
132
133
//Set control bits 15 ande 14 to 0 and 1, respectively, for frequency register 0
134
LSB |= 0x4000;
135
MSB |= 0x4000;
136
137
WriteRegister(0x2100);
138
WriteRegister(LSB);
// Write lower 16 bits to AD9833 registers
139
WriteRegister(MSB);
// Write upper 16 bits to AD9833 registers.
140
WriteRegister(0xC000);
// Phase register
141
WriteRegister(Waveform);
// Exit & Reset to SINE, SQUARE or TRIANGLE
142
143
}
144
void
WriteRegister(
int
dat) {
145
146
// Display and AD9833 use different SPI MODES so it has to be set for the AD9833 here.
147
SPI.setDataMode(SPI_MODE2);
148
149
digitalWrite(FSYNC, LOW);
// Set FSYNC low before writing to AD9833 registers
150
delayMicroseconds(10);
// Give AD9833 time to get ready to receive data.
151
152
SPI.transfer(highByte(dat));
// Each AD9833 register is 32 bits wide and each 16
153
SPI.transfer(lowByte(dat));
// bits has to be transferred as 2 x 8-bit bytes.
154
155
digitalWrite(FSYNC, HIGH);
//Write done. Set FSYNC high
156
}
Работает, пробуйте хотя это тот же код что и у вас
я не попробую, у меня AD9833 пока еще нет )))
На фрутовской библиотеке скетч поменьше памяти забирает )))
Всё закинул в папку скетча, поправил кавычки и скомпилировал
Да, ток при 9 вольтах на исправной микросхеме будет и более 1 ампера, надо поправить в коде
учитывая этот параметр, как это будет выглядеть? (с библиотекой не разбирался)
Здравствуйте!
С нетерпением жду продолжения проекта. Я делал такие генераторы на 2206. Люди пользуются. Отзывы отличные.
Для улучшения параметров и юзабельности прибора давно смотрел в сторону Ардуино платформы. Но, к сожаления я не программист. Плату развести, дизайн сделать, спаять - это да. Да и времени не особо. На вас вся надежа.
С уважением
По току в коде ничего и нет, находит максимум и все. Думаю нужно поискать как регулировать уровень сигнала с AD9833, библиотеку пока не смотрел.
Можно конечно прикрутить еще модуль електронного сопротивления, но это увеличивает бюджет
Так прототипируйте, код уже рабочий. Рабочее напряжение питания 9 вольт, при 12 вольтах токи будут очень большие, это то минимальное напряжение при котором на осциллограмме видна имплозия )))
С выхода AD9833 на вход TDA резисторный делитель.
Схема надеюсь понятна.
Дисплей подключается по шине I2C
По току в коде ничего и нет
Как это нет, смотрим строка 38 -
ina219.setCalibration_16V_400mA();
Сори, исправлюсь
Вот так будет выглядеть под мои деталюшки:
001
#include <Wire.h>
002
#include <SPI.h>
003
#include "LiquidCrystal_I2C.h"
004
LiquidCrystal_I2C lcd(0x3F, 20, 4);
// Для экрана 20х4 (четырехстрочный), I2C адрес дисплея уточнить
005
006
#include "Adafruit_INA219.h"
007
Adafruit_INA219 ina219;
008
009
unsigned
int
imax = 0;
010
unsigned
int
Data_ina219 = 0;
011
012
const
int
SINE = 0x2000;
// определяем значение регистров AD9833 взависимости от формы сигнала
013
const
int
SQUARE = 0x2020;
// После обновления частоты нужно определить форму сигнала
014
const
int
TRIANGLE = 0x2002;
// и произвести запись в регистр.
015
016
const
float
refFreq = 25000000.0;
// Частота кристалла на плате AD9833
017
018
long
Fmin = 200000;
019
long
Fmax = 350000;
020
long
FFmax = 0;
021
long
freq = Fmin;
022
long
ifreq = 0;
023
int
Ftune = 10000;
024
int
Ffinetune = 200;
025
026
const
int
FSYNC = 10;
// Standard SPI pins for the AD9833 waveform generator.
027
const
int
CLK = 13;
// CLK and DATA pins are shared with the TFT display.
028
const
int
DATA = 11;
029
030
031
/********* используемые подпрограммы выносим сюда *********/
032
033
// AD9833 documentation advises a 'Reset' on first applying power.
034
void
AD9833reset() {
035
WriteRegister(0x100);
// Write '1' to AD9833 Control register bit D8.
036
delay(10);
037
}
038
039
// *******************
040
// Set the frequency and waveform registers in the AD9833.
041
void
AD9833setFrequency(
long
frequency,
int
Waveform) {
042
043
long
FreqWord = (frequency * pow(2, 28)) / refFreq;
044
045
int
MSB = (
int
)((FreqWord & 0xFFFC000) >> 14);
//Only lower 14 bits are used for data
046
int
LSB = (
int
)(FreqWord & 0x3FFF);
047
048
//Set control bits 15 ande 14 to 0 and 1, respectively, for frequency register 0
049
LSB |= 0x4000;
050
MSB |= 0x4000;
051
052
WriteRegister(0x2100);
053
WriteRegister(LSB);
// Write lower 16 bits to AD9833 registers
054
WriteRegister(MSB);
// Write upper 16 bits to AD9833 registers.
055
WriteRegister(0xC000);
// Phase register
056
WriteRegister(Waveform);
// Exit & Reset to SINE, SQUARE or TRIANGLE
057
058
}
059
060
061
// *************************
062
// Display and AD9833 use different SPI MODES so it has to be set for the AD9833 here.
063
064
void
WriteRegister(
int
dat) {
065
066
SPI.setDataMode(SPI_MODE2);
067
digitalWrite(FSYNC, LOW);
// Set FSYNC low before writing to AD9833 registers
068
delayMicroseconds(10);
// Give AD9833 time to get ready to receive data.
069
SPI.transfer(highByte(dat));
// Each AD9833 register is 32 bits wide and each 16
070
SPI.transfer(lowByte(dat));
// bits has to be transferred as 2 x 8-bit bytes.
071
digitalWrite(FSYNC, HIGH);
//Write done. Set FSYNC high
072
}
073
074
075
/************************** SETUP *************************/
076
void
setup
() {
077
SPI.begin();
078
Serial
.begin(9600);
079
lcd.begin();
080
ina219.begin(0x40);
081
// ina219.setCalibration_16V_400mA();
082
ina219.setCalibration_32V_2A();
// Интересно, в библиотеку можно внести изменения
083
// сделав свои параметры калибровки? надо 16V 2A
084
085
delay(10);
086
AD9833reset();
// Ресет после включения питания
087
delay(10);
088
089
AD9833setFrequency(freq, SINE);
// выставляем нижнюю частоту
090
091
for
(
int
i=1; i <= 15; i++) {
092
Data_ina219=ina219.getCurrent_mA();
093
if
(Data_ina219 > imax){ imax=Data_ina219; ifreq = freq; }
// Если значение больше, то запомнить
094
if
(freq >=Fmax) {freq = Fmax;}
095
freq=freq+Ftune;
096
AD9833setFrequency(freq, SINE);
097
delay(2);
098
}
099
freq = ifreq-10000;
100
FFmax =ifreq +10000;
101
imax = 0;
102
AD9833setFrequency(freq, SINE);
//
103
for
(
int
j=1; j <= 100; j++) {
104
Data_ina219=ina219.getCurrent_mA();
105
if
(Data_ina219 > imax){ imax=Data_ina219; ifreq = freq; }
// Если значение больше, то запомнить
106
lcd.setCursor(0, 2);
// 2 строка
107
lcd.print(ifreq);
108
freq=freq+Ffinetune;
109
AD9833setFrequency(ifreq, SINE);
110
if
(freq >=FFmax) {freq = FFmax;}
111
Data_ina219=ina219.getCurrent_mA();
112
lcd.setCursor(0, 0);
// 1 строка
113
lcd.print(
"GENERATOR MPGSP-V1.0"
);
114
lcd.setCursor(0, 1);
// 2 строка
115
lcd.print(
"Freq = "
);
116
lcd.print(ifreq);
117
lcd.setCursor(0, 3);
// 4 строка
118
lcd.print(
"TOK = "
);
119
lcd.setCursor(7, 3);
// 4 строка 7 позиция
120
lcd.print(Data_ina219);
121
delay(1);
122
}
123
}
// Конец процедуры инициализации прибора
124
125
126
// ТЕЛО ПРОГРАММЫ
127
128
void
loop
() {
129
Data_ina219=ina219.getCurrent_mA();
130
lcd.setCursor(0, 1);
// 2 строка
131
lcd.print(
"Freq = "
);
132
lcd.print(ifreq);
133
lcd.setCursor(0, 3);
// 4 строка
134
lcd.print(
"TOK = "
);
135
lcd.setCursor(7, 3);
// 4 строка 7 позиция
136
lcd.print(Data_ina219);
137
delay(200);
138
if
(Data_ina219 < imax ){
139
140
for
(
int
i=1; i <= 15; i++) {
141
Data_ina219=ina219.getCurrent_mA();
142
if
(Data_ina219 > imax){ imax=Data_ina219; ifreq = freq; }
// Если значение больше, то запомнить
143
if
(freq >=Fmax) {freq = Fmax;}
144
freq=freq+Ftune;
145
AD9833setFrequency(freq, SINE);
146
}
147
freq = ifreq-10000;
148
FFmax =ifreq +10000;
149
imax = 0;
150
AD9833setFrequency(freq, SINE);
// Set the frequency and Sine Wave output
151
for
(
int
j=1; j <= 100; j++) {
152
Data_ina219=ina219.getCurrent_mA();
153
if
(Data_ina219 > imax){ imax=Data_ina219; ifreq = freq; }
// Если значение больше, то запомнить
154
freq=freq+Ffinetune;
155
AD9833setFrequency(ifreq, SINE);
156
if
(freq >=FFmax) {freq = FFmax;}
157
}
158
lcd.clear();
//Очистка дисплея
159
160
}
161
}
Заработало.Долго возился Пришлось подредактировать строку
080
ina219.begin(0x40);
в такой вид
080
ina219.begin();
Причину не знаю ,может кто подскажет?
Адрес видимо не совпал, надо перемычки запаивать под нужный адрес, по умолчанию они разомкнуты и не на всех модулях адрес поднимался правильно
Сканер показывает правильный адрес 0х40
И еще наблюдаеться болтанка тока и частоты в пределах 10-15 милиампер и частоты в пределах килогерц 10-15....
Может из за монтажа .... Пока все на проводочках.... Или из за питания все питаю от USB
Адрес распаять жёстко, запитать правильно, такой болтанки по частоте быть не должно, сказать что-то большее не смогу, так как не на чем поэкспериментировать. Как там рассчитывает ток библиотека от фрута мне не ведомо, предыдущая работала в режиме усреднения...
PS ёмкость контура 3000пф, активное сопротивление - 40 метров медяшки 0,5, индуктивность порядка 100