Jump to content
artos5

Пид Регулятор На Avr (Код)

Recommended Posts

Добрый вечер дорогие друзья! Может у кого есть исходник на Си для реализации ПИД регулятора?

Было бы отлично, если бы был прокомментирован код.

Хочу оформить в виде функции , и вызывать ее в момент измерения.

С уважением Артем

Share this post


Link to post
Share on other sites

artos5, может, я чего то не понял. А для чего вызывать функцию ПИД-регулятора при измерении? Если уж регулировать что-то, то, на мой взгляд, регулятор первичен и работает он по внешним сигналам, которые можно принимать в определенные моменты. В том числе и измерения.

Или Вы по иному алгоритму хотите сделать?

Share this post


Link to post
Share on other sites

Я хочу измерять с определенным интервалом температуру. И после измерения - вызывать функцию ПИД. Которая сделает необходимые расчеты и подаст управляющий сигнал.

Share this post


Link to post
Share on other sites

Литиевые батарейки Fanso для систем телеметрии и дистанционного контроля

Системы телеметрии находят все более широкое применение во многих отраслях на промышленных и коммунальных объектах. Требования, предъявляемые к условиям эксплуатации приборов телеметрии и, как следствие, источников питания для них, могут быть довольно жесткими. Fanso предоставляет широкую линейку продукции, рассчитанной на различные условия эксплуатации, что позволяет подобрать батарейку для каждого конкретного применения, в том числе и для устройств телеметрии.

Подробнее

Просто мне подумалось, что именно программа регулятора должна постоянно крутиться в контроллере. И лишь иногда вызываться подпрограмма или функция измерения параметра.

Хотя, многое зависит от инерционности процесса.

Также не забывайте, что выходной сигнал носит импульсный характер. Длительность импульса зависит от измеряемого параметра и от настроек ПИД. А если ПИД вызывается лишь иногда. Не получится ли, что невозможно будет сформировать достаточно короткий импульс?

Share this post


Link to post
Share on other sites

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

Но мне хотя бы какой нибудь пример реализации ПИД...

ШИМ будет программный 16 бит. Памяти - предостаточно!

Почитал тут: http://pidcontrol.narod.ru/

начал считать калькулятором, подставляя значения, получается полная хрень : )) по формуле , значение управления плавает от -500 до -220 ........ это я подставил:

20град. - заданная темп.

10град. - текущая

время измерения 20мс. , то есть - 0.02 сек.

Share this post


Link to post
Share on other sites
                     

Приглашаем на вебинар Решения для построения ультразвуковых счетчиков жидкостей и газов на базе MSP430

Компэл совместно с Texas Instruments 23 октября 2019 приглашают на вебинар, посвященный системам-на-кристалле для построения ультразвуковых расходомеров жидкостей и газов на базе ядра MSP430. Вебинар проводит Йоханн Ципперер – эксперт по ультразвуковым технологиям, непосредственно участвовавший в создании данного решения. На вебинаре компания Texas Instruments представит однокристальное решение, позволяющее создавать точные недорогие счетчики жидкостей и газов.

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

Нашел код!

signed int pid_control(signed char setpoint, signed char currentpoint)
{
static signed int last_error;
signed int P;
signed int D;
static signed int I;
signed int PID;
P = (setpoint - currentpoint);
I = (I + (setpoint - currentpoint) * INTERVAL);
D = (((setpoint - currentpoint) - last_error) / INTERVAL);
last_error = setpoint - currentpoint;
PID = (Kp * P) + (Ki * I) + (Kd * D);
return (PID);
}

И формула вообще другая :)

Где брехня?

И еще вопрос. Буду отталкиваться от приведенной формулы.

Какой диапазон значений коэффициентов Кр, Кi, Kd ?

И также INTERVAL . 1 байт или 2 байта? Или число с плавающей точкой?

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 Вячеслав_НС
      Здравствуйте ! подскажите , какую лучше библиотеку использовать (и где ее взять) для управления i2c atmega8 в atmel studio 7  .  задача - управлять atmega8 по i2c ,  цап  PCF8591T .
      понимаю , в интернете много примеров и библиотек , но хотелось бы пример максимально простой и точно рабочий . т.к. пока что все мои попытки не привели к успеху ... то Atmel Studio 7 при компиляции ругается на несуществующий файл ( к примеру - "stream.h") при использовании библиотеки i2c , то еще какие то грабли .
    • By Антон Плюшкин
      В общем есть небольшая тривиальная задача - сделать свитюльку. Контроллер управляет светодиодиками, цвета меняются, людишки довольны.
      Схема проста: Attiny44a -> 2n3904 x3 -> RGB-светодиод.
      Собрал, протестил, всё норм, но!
      Как только в коде я использую функцию задержки - _delay_ms (util/delay.h) - контроллер повисает!
      #define F_CPU 16000000UL #include <avr/io.h> #include <util/delay.h> int main(void) { // Input/Output Ports initialization // Port A initialization // Function: Bit7=Out Bit6=Out Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In DDRA=(1<<DDA7) | (1<<DDA6) | (0<<DDA5) | (0<<DDA4) | (0<<DDA3) | (0<<DDA2) | (0<<DDA1) | (0<<DDA0); // State: Bit7=0 Bit6=0 Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0); // Port B initialization // Function: Bit3=In Bit2=Out Bit1=In Bit0=In DDRB=(0<<DDB3) | (1<<DDB2) | (0<<DDB1) | (0<<DDB0); // State: Bit3=T Bit2=0 Bit1=T Bit0=T PORTB=(0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0); // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 16000,000 kHz // Mode: Phase correct PWM top=0xFF // OC0A output: Non-Inverted PWM // OC0B output: Non-Inverted PWM // Timer Period: 0,031875 ms // Output Pulse(s): // OC0A Period: 0,031875 ms Width: 0 us // OC0B Period: 0,031875 ms Width: 0 us TCCR0A=(1<<COM0A1) | (0<<COM0A0) | (1<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (1<<WGM00); TCCR0B=(0<<WGM02) | (0<<CS02) | (0<<CS01) | (1<<CS00); TCNT0=0x00; OCR0A=0x00; OCR0B=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 16000,000 kHz // Mode: Ph. correct PWM top=0x00FF // OC1A output: Non-Inverted PWM // OC1B output: Disconnected // Noise Canceler: Off // Input Capture on Falling Edge // Timer Period: 0,031875 ms // Output Pulse(s): // OC1A Period: 0,031875 ms Width: 0 us // Timer1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=(1<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (1<<WGM10); TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10); TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Timer/Counter 0 Interrupt(s) initialization TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (0<<TOIE0); // Timer/Counter 1 Interrupt(s) initialization TIMSK1=(0<<ICIE1) | (0<<OCIE1B) | (0<<OCIE1A) | (0<<TOIE1); // External Interrupt(s) initialization // INT0: Off // Interrupt on any change on pins PCINT0-7: Off // Interrupt on any change on pins PCINT8-11: Off MCUCR=(0<<ISC01) | (0<<ISC00); GIMSK=(0<<INT0) | (0<<PCIE1) | (0<<PCIE0); // USI initialization // Mode: Disabled // Clock source: Register & Counter=no clk. // USI Counter Overflow Interrupt: Off USICR=(0<<USISIE) | (0<<USIOIE) | (0<<USIWM1) | (0<<USIWM0) | (0<<USICS1) | (0<<USICS0) | (0<<USICLK) | (0<<USITC); // Analog Comparator initialization // Analog Comparator: Off // The Analog Comparator's positive input is // connected to the AIN0 pin // The Analog Comparator's negative input is // connected to the AIN1 pin ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0); ADCSRB=(0<<ACME); // Digital input buffer on AIN0: On // Digital input buffer on AIN1: On DIDR0=(0<<ADC1D) | (0<<ADC2D); // ADC initialization // ADC disabled ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0); unsigned char VL_OCR0A = 0, VL_OCR0B = 0, VL_OCR1A = 0; OCR0A = 0; OCR0B = 0; OCR1A = 0; while(1) { _delay_ms( 100 ); VL_OCR0A = VL_OCR0A + 1; VL_OCR0B = VL_OCR0B + 1; VL_OCR1A = VL_OCR1A + 1; if( VL_OCR0A >= 250 ){ VL_OCR0A = 0; } if( VL_OCR0B >= 250 ){ VL_OCR0B = 0; } if( VL_OCR1A >= 250 ){ VL_OCR1A = 0; } OCR0A = VL_OCR0A; OCR0B = VL_OCR0B; OCR1A = VL_OCR1A; } } Т.е. если указать задержку в начале цикла, то светодиод не светится вообще.
      Если задержку убрать - светодиод немного подсвечивает всеми цветами.
      while(1) { _delay_ms( 100 ); // <--- ЗАДЕРЖКА --- VL_OCR0A = VL_OCR0A + 1; VL_OCR0B = VL_OCR0B + 1; VL_OCR1A = VL_OCR1A + 1; if( VL_OCR0A >= 250 ){ VL_OCR0A = 0; } if( VL_OCR0B >= 250 ){ VL_OCR0B = 0; } if( VL_OCR1A >= 250 ){ VL_OCR1A = 0; } OCR0A = VL_OCR0A; OCR0B = VL_OCR0B; OCR1A = VL_OCR1A; } Где я накосячил?
      З.Ы.: Замечаний по поводу оптимизации кода, излишних переменных и п.р. прошу не писать - изощряюсь как могу ибо не пойму почему не работает
    • By LegionKC
      Добрый день.
      Экспериментирую с платой TP4056 и MK ATmega8, конкретнее - пытаюсь собрать простенькое зарядное устройство с выводом параметров при зарядке/разрядке на АЦП МК. Для измерения тока нашел ACS712. Думаю, что получится выводить ток при зарядке (т.е. когда идет питание на TP4056 и нагрузка отключена) и при разрядке (питание выключено, нагрузка подключена). Нагрузка - резистор. Возникла проблема с измерением напряжения на АКБ. Вернее, проблема с отсутствием идей как это сделать. Может какую-нибудь схему делителя напряжения нужно сделать? Прошу помочь советом. Схему из пэинта прилагаю.
      Спасибо.
       

    • By Cheshire Cat
      Здравствуйте, только начинаю изучать программирование мк. Я уже задавал этот вопрос в моих прошлых схемах мне отвечали что-то типа "любой стабилизрованый источник постоянного напряжения", или кидали схему такого источника. Можно назвать мне конкретное устройство? В общем то что я смогу забить в гугл и приписать купить. 

      Я уже больше двух месяцев жду пока мне придут с aliexpress детали для маленького лабараторного блока, но этот вариант может разбиться о кривизну моих рук.  Хочу просто купить такой источник и наконец заняться непосредственно МК. 
    • By Cheshire Cat
      Здравствуйте, только начал изучать программирование микроконтроллеров. В учебнике есть схема, но она не учитывает питание и землю. Скажите правильно ли я её дополнил.
      И еще дополнительный вопрос. Что можно использовать как источник постоянного питания на 5В? Из не дорогого и того, что можно купить в Казани. Знаю, что лучший вариант - лабораторный БП, но они дорогие.

  • Сообщения

    • Частота дикая какая-то. У меня нет нормальных приборов. С  "частотомером до 50 МГц своими руками. На одной микросхеме 74hc4060" при делителе 16х показывает 126кГц. То-бишь 126кГц х 16 = примерно 2 МГц при делителе 32х показывает 52кГц. 52кГц х 32 = примерно 1,66 МГц Мерил на выходе на динамик. На 5й, 10й, 12й ногах ситуация кардинально не меняется. Щас ваще 144-150кГц х 16 показывает = 2,4МГц
    • Как только умер Ленин, оказалось, что второй человек в партии, товарищ Троцкий — предатель. Каменев, Зиновьев, Бухарин и Сталин свергли Троцкого и изгнали из СССР. Но через пару лет оказалось, что Каменев, Зиновьев и Бухарин тоже враги и вредители. Тогда доблестный товарищ Генрих Ягода их арестовал. Чуть позже Ягоду как вражеского агента арестовал Ежов. Но через пару лет оказалось, что и Ежов не товарищ, а обычный предатель и вражеский агент. И Ежова арестовал Берия. После смерти Сталина, все поняли, что и Берия тоже предатель. Тогда Жуков арестовал Берию.  Но вскоре Хрущев узнал, что Жуков враг и заговорщик. И сослал Жукова на Урал.  А чуть позже вскрылось что и Сталин–то был врагом, вредителем и предателем. А вместе с ним и большая часть политбюро. Тогда Сталина вынесли из мавзолея, а политбюро и примкнувшего к ним Шепилова разогнали честные партийцы во главе с Хрущевым.  Прошло несколько лет и выяснилось, что Хрущев был волюнтаристом, проходимцем, авантюристом и врагом. Тогда Брежнев отправил Хрущева на пенсию. После смерти Брежнева, выяснилось, что и он был вредителем и причиной застоя.  Потом было еще двое, которых никто и запомнить-то не успел. Но тут пришел к власти молодой, энергичный Горбачев. И оказалось, что вся партия была партией вредителей и врагов, но он–то сейчас все исправит.  Тут–то СССР и развалился. А Горбачев оказался врагом и предателем.  Вы ознакомились с кратким курсом истории СССР.
    • А где ФЧХ? Вещать о линейности без созерцания картины PH-фактора - моветон. 
    • Судя по формату номера, это контроллер с неперезаписываемой заказной прошивкой. Даташиты на такое не выпускаются.
    • германий ангажируется в связи с малым падением напряжения на переходе, я правильно понимаю? Так то и кремний умеет быть диодом
    • Я то могу. А вот ты не увиливай, и обсуди фильмы со своим закадычном коллегой по теме, вместо дешёвых разборок с  новичками. Котёнок столько фильмов тут запостил, промеж моих анекдотов, но ни одна скотина нормально их с ним не обсудила. А он ведь для вас всех старается. Чтобы ты вышел из этой темы полноценным гражданином.  Ему-то всё это не надо, он это знает лучше вас всех. И он уже гражданин. А ты, видать, как был с неблагодарным физическим лицом, впервые зайдя в эту тему, так с ним и останешься.
  • Покупай!

×
×
  • Create New...