oner

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

127 posts in this topic

oner    9

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

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
BARS_    996
19 минут назад, oner сказал:

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

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

Share this post


Link to post
Share on other sites
oner    9

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

SdIiT_Ejk9Q.jpg

Edited by oner

Share this post


Link to post
Share on other sites

Приглашаем на вебинар «Создание беспроводных устройств на системах-на-кристалле семейства SimpleLink компании TI»

Компания Компэл, совместно с Texas Instruments приглашают 26 июня принять участие в вебинаре, где инженер по применению беспроводных технологий компании TI расскажет, как на новых беспроводных системах можно реализовать несколько полезнейших в повседневной жизни функций для ваших устройств. С развитием элементной базы TI становится возможной реализация более удобных, функциональных и безопасных систем, недоступных ранее. Вебинар проводит инженер по применению беспроводных технологий в TI Мари Хернес(будет дублированный перевод).

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

Видео вебинара «Уникальный подход MORNSUN к разработке DC/DC-преобразователей. Что на выходе?»

На сайте КОМПЭЛ доступны материалы вебинара, посвященные последнему поколению DC/DC преобразователей с фиксированным входом R3 от MORNSUN. Вы можете посмотреть видеозапись, ознакомиться с презентацией и ответами на вопросы.

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

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

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

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

Share this post


Link to post
Share on other sites
oner    9

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

Share this post


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

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

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

Share this post


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

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

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

Share this post


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

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

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

Share this post


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

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

 

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

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

 

Share this post


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

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

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

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

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

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

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

Share this post


Link to post
Share on other sites
oner    9

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

В момент включения на затворе полевика ноль, ток, протекающий через резистор, тоже равен нулю, как и падение напряжения на нем. АЦП измеряет это падение напряжения и сравнивает результат (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
oner    9
10 минут назад, IMXO сказал:

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

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

Схема:

LZbQTEnMGiU.jpg

 

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

Edited by oner

Share this post


Link to post
Share on other sites
IMXO    1498

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

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

Share this post


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

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

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

Share this post


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

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

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

Share this post


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

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

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

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

не нужен...

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

Share this post


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

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

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

Share this post


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

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

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

Share this post


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

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

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

Share this post


Link to post
Share on other sites
IMXO    1498

 

Цитата

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

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

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

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


  • Similar Content

    • 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), и с внешним без разницы.
      Может у них есть какая то очередность включения?
       

    • By pndbr
      Здравствуйте. Может у кого есть печатная плата для отладочной платы на atmega8,32,128 в корпусе tqfp или attiny2313.
      Накопилось много распая с незалоченными камнями и очень хочется пустить их в дело и наконецто научиться хоть как-то программировать. Рисовать печатку самому не хватает опыта. Может у кого есть наработки? Прошу поделиться.
      Поиск выдает только отладочные платы в дип. А если и есть tqfp то в ардуиновском формате т.е без доп перефирии (же дисплеев,клавиатуры,7 сегментных индикаторов,потенциометров,энкодеров..и.т.д)
    • By dommax
      Распродаю остатки радиодеталей.
      Для удобного поиска написал WEB страничку http://detali.syremo.com.ua/
      Количество может не совпадать. Пишите - отвечу. Договоримся...
      Отправляю только по Украине. Перед отправкой смогу сделать фото.
  • Сообщения

    • @ZLOdeyB@sil@ я собирал в один тройник печку кухонную, чайник, утюг , нагрузка нормальная получалась, даже с запасом  
    • Ты как обычно , дурак и не лечишься! Где ты увидел 2,2 ком там резистор. Ясно написано 750 ом и 2200,0 это электролит параллельно и объединено кавычкой. Был бы резистор 2,2 ком и подписал бы 2,2 ком , а так 2200,0. Ещё раз подтверждается,что практики нет ни какой,один теоретический бред несёшь всегда! И тема эта ни какого отношения не имеет к Корректору МС.Просто создал автор дубль тему ( Корректор Василича) и все разговоры те же что и в основной теме о ММ  корректоре ламповом на 6Н17Б+6Н16Б а создание дубль темы запрещено правилами.. Все корректоры ламповые являются ММ корректорами , для МС  просто трансформатор на вход ставится или каскад  транзисторный с коэф.ус. 5-10 раз . Вот и весь МС.
    • Уважаемый @ARV простите меня за этот код: lcd_dat(((checkcrc()/100)%10)+48); lcd_dat(((checkcrc()/10)%10)+48); lcd_dat((checkcrc()%10)+48); Хочется что-то сказать в свое оправдание.... Но на ум ничего не приходит.По всей видимости торопился, когда писал ответ на форум и скорей всего от незнания. Если я правильно понимаю, то возвращаемое значение функции должно быть присвоено глобальной переменной?  uint8_t crc_2; // объявлена глобально int checkcrc() // функция посчета значения контрольной суммы { uint8_t crc =0; for (uint8_t i=0; i<(sizeof term_code / sizeof term_code[0]); i++) //for (uint8_t i=0; i<8; i++) { crc = _crc_ibutton_update(crc, term_code[i]); } return crc_2=crc; }   Или есть другой способ отобразить, в данном случае, возвращаемые данные на LCD_дисплее? lcd_dat('R'); lcd_dat('C'); lcd_dat('_'); lcd_dat('2'); lcd_dat('='); lcd_dat(((crc_2/100)%10)+48); lcd_dat(((crc_2/10)%10)+48); lcd_dat((crc_2%10)+48); Подскажите пожалуйста. @Starichok  обязательно найду и разберусь в сути вопроса, но без учителя у меня уйдет много времени. В интернете находил такую информацию, но я ее читаю, а она от моей головы отскакивает как от стенки горох. Слишком уж много непонятных слов для меня (пока). Мне бы решение этого вопроса на бумагу переложить (подсчитать вручную с помощью карандаша и бумаги).  Если не получится самостоятельно разобраться, пойду в институт к своему преподавателю по математики, попрошу ее растолковать мне эту методику. Она нам всегда говорила, что красивей математики может быть только музыка.
    • Статья в ВРЛ N104 "Источники стабильного тока и их применение."  
    • Когда то долго искал. Ришад Шафиев и Гунеш,1984 год  
    • Заработал!!! Запутался с фазами по тгр. методом тыка нашел.     Пока снял 13.5воль под нагрузкой 2-3А  дальше лампа не дает напруга проседает до 140в (ток 260мА)  шим начинает глючить (быстро включается выключается) Транзисторы при такой нагрузке остаются холодными.  Что не нравится то что шим (обвязка управления) жутко глючит (как писал выше вкл-выкл )  при любых действиях на регулировку и при изменение нагрузки. в общем скарей всего и за того что все на соплях. это на выходе тл494. под нагрузкой.