Jump to content
oner

Управление полевиком на основании данных с АЦП

Recommended Posts

Собираю устройство, которое на основании измеренного напряжения на резисторе своим АЦП на одном из своих портов выдает импульсы широтой, зависящей от измеренного напряжения. Широтой этого импульса задается ток, который, протекая через вышеупомянуты резистор, формирует вновь измеряемое напряжение. Пока результат такой. Зеленым цветом - сигнал на выходе контроллера, красным - напряжение на резисторе в цепи истока полевого транзистора, оно пропорционально току, протекающему через этот транзистор.Результат такой:

SdIiT_Ejk9Q.jpg

Вопрос знатокам: почему это измеренное напряжение всегда застывает на одной и той же величине (0,8В)? Код:

#include <mega8.h>
#include <delay.h>
#include <stdio.h>


long result;
long n=1;
// Voltage Reference: AVCC pin
#define ADC_VREF_TYPE ((0<<REFS1) | (1<<REFS0) | (1<<ADLAR))


unsigned char read_adc(unsigned char adc_input)
{
ADMUX=adc_input | ADC_VREF_TYPE;
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=(1<<ADSC);
// Wait for the AD conversion to complete
while ((ADCSRA & (1<<ADIF))==0);
ADCSRA|=(1<<ADIF);
return ADCH;
}

void main(void)
{


// Input/Output Ports initialization
// Port B initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In 
DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T 
PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);

// Port C initialization
// Function: Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In 
DDRC=(0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (0<<DDC3) | (0<<DDC2) | (0<<DDC1) | (0<<DDC0);
// State: Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T 
PORTC=(0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0);

// Port D initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In 
DDRD=(0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T 
PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);

// ADC initialization
// ADC Clock frequency: 125,000 kHz
// ADC Voltage Reference: AVCC pin
// Only the 8 most significant bits of
// the AD conversion result are used
ADMUX=ADC_VREF_TYPE;
ADCSRA=(1<<ADEN) | (0<<ADSC) | (0<<ADFR) | (0<<ADIF) | (0<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (0<<ADPS0);
SFIOR=(0<<ACME);

PORTB=0x00;
DDRB=0x01;

#asm("sei")

while (1)
      {
           
      result=((read_adc(0)*5)/256.00); // Тут мы измерили напряжение на резисторе
      if (result>2)                    // и сравниваем, например, с 2В. В случае отклонения
                                       // измеренной величины от 2В меняем длительнось импульса n.
      {
      n=n-1;
      PORTB.0=1;
      delay_ms(n);
      PORTB.0=0;
      delay_ms(20);     
      }
      if (result<2)
      {
      n=n+1;
      PORTB.0=1;
      delay_ms(n);
      PORTB.0=0;
      delay_ms(20);
      }  
      };
}

 

Edited by oner

Share this post


Link to post
Share on other sites
19 минут назад, oner сказал:

почему это измеренное напряжение всегда застывает на одной и той же величине (0,8В)?

Т.е. после этого МК перестает его замерять и всегда выдает одно и то же значение? И вывод ШИМ просто ужасен. У МК есть аппаратный ШИМ, почему нельзя использовать его?

Share this post


Link to post
Share on other sites

Нет, МК на основании измеренного напряжения на резисторе своим АЦП на одном из своих портов выдает импульсы широтой, зависящей от измеренного напряжения. Широтой этого импульса задается ток, который, протекая через вышеупомянуты резистор, формирует вновь измеряемое напряжение. Т.е. контроллер управляет полевиком и держит его ток в рамках определеной величины. И эта величина никак не совпадает с тем, что мне нужно, а всегда стабилизируется на 0,8В. (красная линия на рисунке ниже)

SdIiT_Ejk9Q.jpg

Edited by oner

Share this post


Link to post
Share on other sites

Конденсаторы Panasonic. Часть 4. Полимеры – номенклатура

В заключительной, четвертой статье из цикла «Конденсаторы Panasonic» рассматриваются основные достоинства и особенности использования конденсаторов этого японского производителя на основе полимерной технологии. Главной конструктивной особенностью таких конденсаторов является полимерный материал, используемый в качестве проводящего слоя. Полимер обеспечивает конденсаторам высокую электрическую проводимость и пониженное эквивалентное сопротивление (ESR). Номинальная емкость и ESR отличается в данном случае высокой стабильностью во всем рабочем диапазоне температур. А повышенная емкость при низком ESR идеальна для решения задач шумоподавления и ограничения токовых паразитных импульсов в широком частотном диапазоне.

Читать статью

                     

STM32G0 - средства противодействия угрозам безопасности

Результатом выполнения требований безопасности всегда является усложнение разрабатываемой системы. Особенно чувствительными эти расходы стали теперь, в процессе массового внедрения IoT. Обладая мощным набором инструментов информационной безопасности, микроконтроллеры STM32G0 производства STMicroelectronics, объединив в себе невысокую цену, энергоэффективность и расширенный арсенал встроенных аппаратных инструментов, способны обеспечить полную безопасность разрабатываемого устройства.

Подробнее...

Только что, oner сказал:

а всегда стабилизируется на 0,8В

Во-первых ШИМ организован криво. Во-вторых судя по графику, на АЦП приходит масса мусора, ШИМ плавает как ему вздумается. Надо как минимум делать усреднение на основании нескольких измерений, применять стабильный ИОН и ставить хоть какой-то фильтр на входе АЦП. В-третьих, вот так вот в лоб управлять не получится, надо писать ПИ или ПИД регулятор.

Share this post


Link to post
Share on other sites

Почему-же? Ток становится достаточны ровным. Не идеальная прямая, но меня и такая форма устривает. Вопрос в том, как поменять величину.

Share this post


Link to post
Share on other sites
Только что, oner сказал:

Вопрос в том, как поменять величину.

Волынить требования представленные выше и по человечески описать, что же все таки работает не как надо. А то уже ток измеряется в вольтах.

Share this post


Link to post
Share on other sites
1 минуту назад, BARS_ сказал:

А то уже ток измеряется в вольтах.

Ток, протекающий через резистор сопротивлением 1 Ом создает падение напряжения. численно равное величине тока.

Share this post


Link to post
Share on other sites
Только что, oner сказал:

создает падение напряжения.

И что при этом не работает?

Share this post


Link to post
Share on other sites
Только что, BARS_ сказал:

И что при этом не работает?

 

38 минут назад, oner сказал:

 почему это измеренное напряжение всегда застывает на одной и той же величине (0,8В)? 

 

Share this post


Link to post
Share on other sites
6 минут назад, oner сказал:

Вопрос в том, как поменять величину.

для начала приведете схему

41 минуту назад, oner сказал:

почему это измеренное напряжение всегда застывает на одной и той же величине (0,8В)?

не правильно задаете вАпрос...

правильный вопрос почему это напряжение не равно 2в....

Share this post


Link to post
Share on other sites

Ну вот смотрите:

В момент включения на затворе полевика ноль, ток, протекающий через резистор, тоже равен нулю, как и падение напряжения на нем. АЦП измеряет это падение напряжения и сравнивает результат (result) с заданной величиной напряжения (в данном случае- 2В)

result=((read_adc(0)*5)/256.00);
      ....
      if (result<2)
      {
      n=n+1;
      PORTB.0=1;
      delay_ms(n);
      PORTB.0=0;
      delay_ms(20);
      }  

Если result<2, то на полевик через RC-фильтр посылается прямоугольный сигнал определенной ширины, за счет прохождения которого полевик приоткрывается и через него начинает течь ток, создавая падение напряжения на резисторе. Это напряжение снова измеряется и сравнивается с 2В. В случае отличия длительность импульса соответственным образом меняется. 

Share this post


Link to post
Share on other sites
10 минут назад, IMXO сказал:

для начала приведете схему

Правильный вопрос почему это напряжение не равно 2в....

Схема:

LZbQTEnMGiU.jpg

 

Да, вопрос уточнен Вами правильно. Но там не обязательно 2В. Я и вольт ставил. и 0,35В - бесполезно.

Edited by oner

Share this post


Link to post
Share on other sites

а ну тут все просто... открываем даташит на половичек, находим значение Gate-Source Threshold Voltage

и получаем искомые 0,8в....

Share this post


Link to post
Share on other sites
6 минут назад, oner сказал:

АЦП измеряет это падение напряжения

А где гарантия, что АЦП верно замеряет напряжение? Необходимо сделать вывод значения по UART и посмотреть, что приходит на АЦП. Это раз. Второе, IRF740 не будет так нормально работать, ему нужен драйвер из пары биполярников.

Share this post


Link to post
Share on other sites
Только что, BARS_ сказал:

ему нужен драйвер из пары биполярников.

драйвер ему на... не нужен....

Share this post


Link to post
Share on other sites
Только что, oner сказал:

Что даст UART и куда по нему выводить значение

Даст понимание того, что именно приходит с АЦП и что рассчитывается по вашей формуле. Для вывода значений в протеусе есть терминал.

1 минуту назад, IMXO сказал:

не нужен...

Ну и через резистор 10К он тоже открываться нормально не будет.

Share this post


Link to post
Share on other sites
1 минуту назад, BARS_ сказал:

А где гарантия, что АЦП верно замеряет напряжение?

какой юарт? какая гарантия? ТС в протезе схему крутит... блин, театр абсурда...

Share this post


Link to post
Share on other sites
Только что, IMXO сказал:

ТС в протезе схему крутит

И что? От этого у него расчет значение с АЦП и измерение происходит 100% правильно?

Share this post


Link to post
Share on other sites
2 минуты назад, BARS_ сказал:

Для вывода значений в протеусе есть терминал.

Можно поподробнее?

Share this post


Link to post
Share on other sites

 

Цитата

И что? От этого у него расчет значение с АЦП и измерение происходит 100% правильно?

прикинь, да...

Только что, BARS_ сказал:

Ну и через резистор 10К он тоже открываться нормально не будет.

да ну, шо правда?

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Similar Content

    • By Вячеслав_НС
      помогите разобраться с кодом .(послать значение по шине TWI на ЦАП PCF8591) не работает в протеусе ...
      #define F_CPU 8000000UL 
      #include <stdlib.h>
      #include <avr/io.h>
      #include <util/delay.h>
      //*** ИНИЦИАЛИЗАЦИЯ ШИНЫ TWI ***/
      void TWI_Init(void)
      {
          // Установка тактовой частоты F_scl  = 100 кГц
          TWBR =32;
          TWSR &= (~((1<<TWPS1)|(1<<TWPS0)));
          TWCR |= (1 << TWEN);            // Разрешение работы TWI-модуля
      }

      /*** ЗАПУСК TWI ***/
      void TWI_Start(void)
      {
          TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
          while(!(TWCR & (1<<TWINT)));
          TWDR = 1001000; // передача адреса модуля PCF8591 в шину TWI
          TWCR=(1<<TWINT)|(1<<TWEN);
          while(!(TWCR & (1<<TWINT)));
      }
      /*** ОСТАНОВКА TWI ***/
      void TWI_Stop(void)
      {
          TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
          while(TWCR & (1<<TWSTO));        // Ожидание завершения передачи условия СТОП
      }
      /***ПЕРЕДАЧА ДАННЫХ В TWI***/
      void TWI_WriteByte(uint8_t data)
      {
          TWDR = data;                    // Загрузка данных в TWDR
          TWCR=(1<<TWINT)|(1<<TWEN);
          while(!(TWCR & (1 << TWINT)));    // Ожидание завершения передачи данных
      }
      /*** ПЕРЕДАТЬ ЗНАЧЕНИЕ В PCF8591 ***/
      void PCF8591_get(void)
      {
          TWI_Start();                // Запуск TWI
          TWI_WriteByte(0x40);        //включаем цап
          TWI_WriteByte(100);            // запись в ЦАП значения 100
          TWI_Stop();                    // Остановить TWI
      }            
          int main(void)
      {
          TWI_Init();    
          while (1)
      {
              PCF8591_get;
             _delay_ms(50);
        }
      }
    • By artos5
      Приветствую всех на этом форуме!
      Есть необходимость измерять сигнал при помощи данного АЦП. С помощью этого АЦП можно измерять 4 аналоговых не дифференциальных сигнала . Схема следующая:
      Schematic_Temp_opto_sens_V2_20190817124112.pdf
      Картинками с более низким разрешением:
      библиотеку за основу взял эту:
      https://github.com/nsaspook/nidaq700/blob/master/supermoon/example/ADS1220.c
      Путем незначительного допиливания, получилась такая библиотека:
       
      Поправил только эти функции:
      void ADS1220SendByte(unsigned char Byte) { unsigned char Result = 0x01, i=0, flg=0; MOSI_LO; Delay_us(1); for(i=0;i<8;i++) { SCK_LO; //ADC_CLK=0 Delay_us(4); if (flg) MOSI_LO; Delay_us(1); SCK_HI; //ADC_CLK=1 Delay_us(1); if (Byte&Result){ MOSI_HI; flg=1; } else MOSI_LO; Delay_us(4); Result<<=1; } SCK_LO; //ADC_CLK=0 } unsigned char ADS1220ReceiveByte(void) { unsigned char Result = 0, i=0; for(i=0;i<8;i++) { Result<<=1; SCK_LO; //ADC_CLK=0 Delay_us(5); //Delay_us(5); SCK_HI; //ADC_CLK=1 Delay_us(3); if (MISO) Result++; Delay_us(2); } SCK_LO; //ADC_CLK=0 return Result; } И добавил эту функцию:
      void ADS1220Config_MUX_GAIN(uint8_t mux, uint8_t gain) { unsigned Temp; ADS1220ReadRegister(ADS1220_0_REGISTER, 0x01, &Temp); // clear prev value; Temp &= 0x0f; Temp |= gain; Temp |= mux; // write the register value containing the new value back to the ADS ADS1220WriteRegister(ADS1220_0_REGISTER, 0x01, &Temp); ADS1220ReadRegister(ADS1220_1_REGISTER, 0x01, &Temp); // clear prev DataRate code; Temp &= 0x1f; Temp |= (ADS1220_DR_600 + ADS1220_CC); // Set default start mode to 600sps and continuous conversions // write the register value containing the new value back to the ADS ADS1220WriteRegister(ADS1220_1_REGISTER, 0x01, &Temp); } ADS1220.h :
      в результате получаю такую осциллограмму :

      То есть , постоянно считывается 0.
      А вот регистры конфигурации:
      Задаю номер входа MUX и усиление :
       

       
      Читаю данные так:
      ADS1220Config_MUX_GAIN(ADS1220_MUX_0_G, ADS1220_GAIN_1); HAL_Delay(10); temp_[0] = ADS1220ReadData(); Это для 0 канала. 
      Пробовал и так:
      ADS1220SetChannel(ADS1220_MUX_0_G); ADS1220SetGain(ADS1220_GAIN_1); temp_[0] = ADS1220ReadData(); Результат аналогичный. Кто что подскажет? Может кто заметит какой косяк в коде? Уже голова дымит ..
    • By LegionKC
      Добрый день.
      Экспериментирую с платой TP4056 и MK ATmega8, конкретнее - пытаюсь собрать простенькое зарядное устройство с выводом параметров при зарядке/разрядке на АЦП МК. Для измерения тока нашел ACS712. Думаю, что получится выводить ток при зарядке (т.е. когда идет питание на TP4056 и нагрузка отключена) и при разрядке (питание выключено, нагрузка подключена). Нагрузка - резистор. Возникла проблема с измерением напряжения на АКБ. Вернее, проблема с отсутствием идей как это сделать. Может какую-нибудь схему делителя напряжения нужно сделать? Прошу помочь советом. Схему из пэинта прилагаю.
      Спасибо.
       

    • By pryanic
      Доброго времени суток. Понадобилось разобраться с АЦП.  Основной материал использовал Евстифеева (микроконтроллеры семейства мега) и учебный курс Di-Halt.
      На первый раз задача простая - обработать напряжение с переменного резистора и послать по UART в терминал. С терминалом уже кое-что делал, так что тут вряд ли косяк есть.
      Кратко опишу программу: каждую секунду в обработчике прерывания таймера (не совсем точно, прерывание по переполнению Т0) запускаю преобразование АЦП установкой в 1 бита ADSC. 
      В обработчике прерывания АЦП читаю байт ADCH (выравнивание по левому краю ADLAR=1) и шлю по уарт. Но в терминал приходят одни FF независимо от положения движка потенциометра (подключен к PC1 средним контактом, крайними на землю и AVCC)
       
       
      ADC_test.zip
    • By dav1977
      Кто-нибудь запускал скоростные  АЦП  AD7606(последовательного приближения)
       в последовательном режиме считывания данных ?,
      из 4 шт одна заработала, остальные на выводе последовательного вывода DOUT ничего не выдают постоянно 0.
      пробовал переключаться с внутренним опорным источником(выдает 2.49), и с внешним без разницы.
      Может у них есть какая то очередность включения?
       

  • Сообщения

    • Устройство для ручной подачи припоя. Припой диаметром 1 мм наматывается на катушку от 13 мм ленты для пишущих машинок и помещается в их же коробочку. В коробочке сверлится отверстие 2,5 мм для выхода припоя. В куске изоленты проделывается отверстие и коробочка оборачивается с краёв  для фиксации крышки. Нужное количество припоя  вытягивается вручную. На катушку помещается около 15 м припоя диаметром 1 мм. Диаметр  готового устройства 55 мм, толщина 20 мм. Остальное понятно по фото.
    • почему же не стабилитрон  затвор - эмиттер ?. реальная схема  Lenze . :
    • Возможен и такой вариант.  Ламповый усилитель со своими 12-15вт.  вовлекает слушателя в атмосферу исполнителя,  а транзисторный со своими 150вт. не вовлекает, он может хорошо, очень хорошо или замечательно, громко или тихо, но просто играть  музыку.  Как то вот у меня сложилось такое впечатление. 
    • @FonSchtirlitz Справедливое утверждение! При покупке надо подключать и слушать с тем устройством, с которым они будут работать. Я тоже всегда так поступаю. Да и колонки для УНЧ тоже надо подбирать и реально прослушивать с тем усилителем с которым они будут работать, для того, чтобы добиться идеальной согласованности и качества. 
    • Ну тогда открою Вам маленькую тайну - 99% частотников в дистанционном режиме успешно работают вообще без пульта, который можно смело снять  даже во время работы и выбросить, например, в мусорное ведро, поскольку исполнительная программа находится не в пульте, а в самом частотнике. В пульт можно скопировать программу и перенести на бесконечное число подобных частотников. Большинство крупных предприятий, имеющих возможность заключать прямые договоры с изготовителем так и поступают - покупают 100 частотников и ...один пульт. Большинство мировых брендов не нуждаются вообще в пультах, поскольку имеют в арсенале соответствуюшие программы-оболочки, позволяющие программировать частотники напрямую с ПК. Теперь об индикации. Нет такого параметра, который нельзя было бы вывести на индикацию , используя совершенно другие индикационные устройства, нежели пульт, используя стандартные аналого-цифровые входы-выходы частотника. Их нужно только правильно запрограммировать. Большинство мануалов потому и напоминвют китайскую грамоту, поскольку большинство разделов посвящено именно этой теме - как программировать входы-выходы, чтобы расширить функционал помимо пульта. И, наконец последнее.что мешает перенести пульт(если уж без него никак) на расстояние достаточное большое, используя тот же FTP?
    • Есть такая защита, плата китайская. Много всего наворочено, что эта защита может?  
    • Подобных наушников с подобными параметрами не мало. Но отзывы о них противоположные. В отличии от ас у наушников есть одна специфическая особенность, которая сильно влияет на восприятие звука. Во  я и говорю- НАУШНИКИ НАДО СЛУШАТЬ ЛИЧНО.
  • Покупай!

×
×
  • Create New...