Jump to content
NebsteR

Общие вопросы по PIC-микроконтроллерам

Recommended Posts

Поскольку разговор идет в ветке Микрочипа, то стоит обратить Ваше внимание на чипы с встроенным математическим акселератором ПИД регулятора.

http://ww1.microchip.com/downloads/en/DeviceDoc/40001770D.pdf

http://ww1.microchip.com/downloads/en/DeviceDoc/40001769C.pdf

Ну или перейти на 16-битные МК Микрочипа (если нравится конкретно Микрочип).

 

Share this post


Link to post
Share on other sites

То есть на нем можно полноценный пид регулятор напряжения сделать? Я имею ввиду не писав много кода с обычным пид регулятором как это обычно бывает. 

Share this post


Link to post
Share on other sites

Можно. Это и называется периферией независимой от ядра. Основное направление миграции 8-битников.

Share this post


Link to post
Share on other sites

Wolfspeed раскрывает секреты прорывных технологий в силовой электронике

Компания Wolfspeed предлагает разработчикам стать частью новой истории и проверить самостоятельно все преимущества компонентов с широкой запрещённой зоной. Представляем вашему вниманию подборку материалов по теме SiC MOSFET, SiC-диодов и их применениям.

Подробнее

11 часов назад, Securety сказал:

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

а там много строчек? Хотя наверное да, для 8-битки задачка так себе

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

Edited by mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Share this post


Link to post
Share on other sites

Материалы вебинара "Практика разработки IoT-устройств с BlueNRG-LP – «волшебной палочкой» разработчика"

Опубликованы материалы практического вебинара по работе с новой SoC BlueNRG-LP производства компании STMicroelectronics. На вебинаре были рассмотрены новые возможности создания прототипов IoT-устройств на BlueNRG-LP с использованием экосистемы и отладочных средств ST, а также продемонстрированы использование BlueNRG-GUI v.4.0.0 и примеры кода в IDE, настройка и работа в сети BLE-MESH, пример управления умным домом с помощью BlueNRG-LP.

Подробнее

18 минут назад, mail_robot сказал:

Гораздо проще реализовать его...

...аппаратным ЦИФРОВЫМ вычислителем, а не аналоговым на рассыпухе.

Для чего и выпускается специально заточенное под это семейство МК:

1002912406_2020_02.0910-41-01.jpg.464898fa7e203d809fc2c706b30ba200.jpg

 

Причем входные переменные и коэффициенты знаковые 16-битные, а выходная - знаковая 35-битная.

Время расчета модуля - 9 машинных циклов. Плюс загрузка-выгрузка. Итого - порядка 15...17 машинных циклов на итерацию.

При запуске МК на полную скорость - 125 нс/инструкция, получаем порядка 2 мкс на итерацию. Так как скорость АЦП заметно ниже (14 мкс/отсчет), реальная частота семплирования САУ будет ограничена только АЦП. При этом контроллер остается практически свободным для иных задач.

К слову, в этом же семействе есть крайне полезные модули периферии, такие как продвинутый 24-битный модуль захвата с автоматическим определением параметров сигнала (период, скважность и пр.) в количестве 2 шт, микро CPLD (2 или 4 ячейки), зеро-детектор с возможностью работы прямо с высоковольтным знакопеременным сигналом, пара 100 мА пинов для быстрого управления затворами или иными нагрузками, ну и, как водится, обычные интерфейсы типа УАРТов/SPI/IIC.

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

 

 

Share this post


Link to post
Share on other sites

BlueNRG-LP для передачи данных в диапазоне 2,4 ГГц без BLE

В статье представлен набор базовых примеров основных аспектов работы радиотракта в проприетарном режиме, что позволяет создавать на их основе собственные более сложные проекты. Описан режим обновления и типичный сценарий прошивки «по воздуху» OTA для проприетарного режима. Примеры приведены для сред разработки IAR Embedded Workbench for ARM и KEIL uVision 5 for ARM.

Подробнее

та все это понятно, только регулятору надо как правило 3-5 итераций минимум и это еще зависит от характера возмущений. А нормальная аналоговая петля все это сделает за 40-100 нс без каких либо проблем. Прохфессор

Для нешустрых задач, я согласен. Пригодится

Edited by mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Share this post


Link to post
Share on other sites

Осталось назвать задачу, где нужен ПИД с циклом (ну или временем установления, если угодно) в сотню нс. Академик ты наш.... 

))) 

 

Share this post


Link to post
Share on other sites

Человек хотел стабилизатор напряжения сделать. Читать что-ли не умеешь. Я ему в этом контексте и ответил. Зануда ты дядя пипец просто...


Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Share this post


Link to post
Share on other sites

Стабилизатор КАКОГО напряжения? Переменного 50 Гц? 100 нс переходный процесс? :crazy:

Share this post


Link to post
Share on other sites

Постоянного напряжения с резким изменением нагрузки, с поддержкой выставленного напряжения. Допустим для этих только целей я присмотрел данный материал.  Где то читал еще про DSP33 есть поддержка поддержания фазы нужного тока управления(могу ошибаться в выражений) как то так описывалось. Подход конечно тут разный можно завести 220в через трансформатор и питать нагрузку и следить за ней. А можно на dc dc boost это делать я допустим для этого больше присматривал.

Share this post


Link to post
Share on other sites

Какое ко всему этому имеет отношение ПИД регулятор?

Петля ФАПЧ тоже является следящей системой, но ПИД в ней не применяется. В ней применяются хоть и математически сходные, но иные схемотехнические решения.

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

Share this post


Link to post
Share on other sites

имеется камень dsPIC33EP512MU810, на сайте микрочипа вижу "Max PWM outputs (including complementary) - 28", открываю даташит по пинам вижу ножки PWM1L,PWM1H, PWM2L..PWM4H итого ножек 8, причем как я понял H это инвертированный L, получается под ШИМ 4 канала? можно каким-то образом получить 8 независимых каналов ШИМ, чтобы была возможность независимо включать и выключать их? Частота положим у всех одна.

Share this post


Link to post
Share on other sites
1 час назад, abit85 сказал:

открываю даташит по пинам вижу ножки PWM1L,PWM1H, PWM2L..PWM4H итого ножек 8

Странно, а я в вашем камне нашёл даже PWM6L и PWM6H.
Разные даташиты смотрим ? :)

PS: Ну а вообще, да, они работают парами. Это для управления ключами.

Share this post


Link to post
Share on other sites

Alex, да ошибся, невнимательно читал, 7 штук их, надо 8, именно для управления ключами, но мне надо инверсно, то есть нужно получить 8 ШИМов но группками по 4 в которых две вот таких линии: 111.jpg  

исходя из документации вроде сгодится метод описанный тут

 222.jpg 

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

Буду благодарен за любые идеи

Share this post


Link to post
Share on other sites

Давайте обратимся к даташиту.
Это :
2020-03-04_21-24-35.png.135655c3bb18006ac8ab6b3ae9d066c7.png
Не оно ? :)

Share this post


Link to post
Share on other sites

Alex, вот я не внимательный, очень похоже что то, что нужно, огромное спасибо!, завтра буду испытывать

Share this post


Link to post
Share on other sites
18 часов назад, abit85 сказал:

имеется камень dsPIC33EP512MU810, на сайте микрочипа вижу "Max PWM outputs (including complementary) - 28", открываю даташит по пинам вижу ножки PWM1L,PWM1H, PWM2L..PWM4H итого ножек 8, причем как я понял H это инвертированный L, получается под ШИМ 4 канала? можно каким-то образом получить 8 независимых каналов ШИМ, чтобы была возможность независимо включать и выключать их? Частота положим у всех одна.

Вы не разобрались с периферией Микрочипа от слова СОВСЕМ.

1. Вам зачем скоростной PWM? Вам нужны единицы наносекунд разрешения?

2. Есть смутное подозрение, что Вы ничего не знаете о ремаппировании периферии. На ногах нет жесткого соединения периферийных модулей. Их нужно присоединять с помощью регистров RPOR (выходы) и RPINR (входы). И тогда Вы будете использовать модули Output Compare (в режиме PWM,) , а не fastPWM, у которого все выходы прибиты к конкретным пинам. 

Только учтите, что к пинам с названием ремапа RPx можно присоединять и входы и выходы, а к пинам RPIx - только ВХОДЫ. Такшта Вам нужны только RPx.

Edited by my504

Share this post


Link to post
Share on other sites

my504

Вы правы, не разбираюсь от слова совсем, я на ARM пишу обычно, но тут подкинули работу, что поделать, больше некому в нашей деревне это осилить...
1) нужны мне именно единицы наносекунд, импульс - 60-80нс, расстояние между концом фронта PWM1H и началом PWM1L не больше 120нс
2) всё я знаю про ремапировании, не переживайте, мне был нужен именно fastPWM он жёстко привязан к ногам

Собственно всё сделал по наводке Alex, всё работает, ему очень благодарен

Share this post


Link to post
Share on other sites

При добавлении в СИ-шный код АСМ - вставки, сделал как указано в компляторе ХС8, используя директивы #asm и #endasm . 

Но при компиляции выскакивает ошибка 800, ругается на переменные, которые уже обьявлены в основной программе.

p1572_C.c:163: error: (800) undefined symbol "DIGIT1"

Что делаю не так, подскажите, плз:unknw:

 


Опыт - это то, что получаешь, не получив того, что хотел

Share this post


Link to post
Share on other sites

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

и  в ставках используй нужное название

Share this post


Link to post
Share on other sites
13 часов назад, IMXO сказал:

скомпилируй код без вставки

Имена переменных поменял, Флаг Z регистра STATUS поменял на 2.  Вроде скомпилировалось нормально. 


Опыт - это то, что получаешь, не получив того, что хотел

Share this post


Link to post
Share on other sites
22.03.2020 в 13:17, wws63 сказал:

Имена переменных поменял, Флаг Z регистра STATUS поменял на 2.  Вроде скомпилировалось нормально. 

Победить этот хитрый компилятор не смог. Зашел " с тыла", кусок асм кода переписал на Си. 


Опыт - это то, что получаешь, не получив того, что хотел

Share this post


Link to post
Share on other sites

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

 

Share this post


Link to post
Share on other sites

Доброго времени суток.

Подскажите что делаю не так. Необходимо настроить внешнее прерывание на RB0. Proteus на изменение RB0 совсем не реагирует. Решил промоделировать в живую на макетке. Прерывание срабатывает однако флаг прерывания не сбрасывается (наблюдаю в пошаговом выполнении). Камень PIC16f886, программатор/отладчик PicKit4, среда разработки MPLABX IDE v5.3, proteus 8.4 SP0.

void main(void) {
    nastroyka();
    F_bili_izmeneniya=1;
    while (1) {
       
        
//        ekran();
        ADC_start();
        ADC_read();
        
        __delay_ms(50);
        __nop;
    }
}
void nastroyka(void){
    //******Настройка прерываний********
    //******GIE=1   PEIE=1  T0IE=0  INTE=0
    //******RBIE=1  T0IF=0  INTF=0  RBIF=0
    
    INTCON=0b11001000;
    IOCB=0xff;
    BCLIE=1;
    //ULPWUIE=1;
   // ANS12=1;
    
    
    
    //*******Настройка порта A
    TRISA0=1;   //вход ***Вход АЦП
    TRISA2=1;   //вход **Вход Uref-
    
    //*******Настройка порта B
    TRISB0=1;
    
    //***********Настройка АЦП***********
    // Настройка времени обрабатки АЦП = 32*Tosc
    ANS0=1;
    ANS2=1;
    ADCS0=0;
    ADCS1=1;
    ADFM=1; //Правое выравнивание результата
        //*****Подключение канала 0
    CHS0=0;
    CHS1=0;
    CHS2=0;
    CHS3=0;
        //****Подтяжка Vref+ к внутренниму +
    VCFG0=0;
    //**** Vref- к внешниму источнику (AN2))
    VCFG1=1;
    //Включить АЦП
    ADON=1;
    
    
    //***********Настройка PORTC***********
    TRISC=0x18;////RC3 and RC4 Input (SDC and SDA)
    TRISC5=1;   //вход кнопки
    
    //***********I2C***********
    SSPADD=0X09;
    SSPSTAT=0X80;
    SSPCON=0X38;
}
void interrupt interr(void){
    volatile char temp;
    if(RBIF){
        temp=PORTB;
        RBIF=0;
    }
}

Почему флаг прерывания не сбрасывается? Что делаю не так? Подскажите протеус адекватный к внешним прерываниям.

Share this post


Link to post
Share on other sites

Разобрался. Регистр ANSELH не был настроен. При запуске устанавливался в единицы (аналоговые входы). При правильной настройке, правильно и макетка (до этого не совсем корректно) и протеус заработал.

Всем спасибо.

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 Ilya Gray
      Доброго времени суток!
      В целом, имеется опыт разработки малых устройств, что-то понимаю, в общем, старательно читаю даташиты, даже понимаю их, но на звание серьёзного инженера (пока что) не претендую.
      Я пытаюсь использовать I2C на 8-битном PIC16F18326. Сижу в даташитах. Всё понимаю, всё делаю, на мой неопытный взгляд, правильно. Даже копирую полностью рабочие примеры (я даже купил такой же микроконтроллер, как в примере, скопировал код, контролируя, что он делает. Но всё равно не работает - SCL/SDA на 5в и всё тут).
      Так вот: PIC16F18326 on breadboard (прошу прощения, я хз как это по-русски) на внутреннем 32мгц кристалле. Чип пашет, без проблем моргаю LEDкой. Ну, думаю, щас быстренько подниму I2C. В итоге SCL SDA сидят на 5в без движения. Я использую LED для отладки. Судя по LED, код заloopливается в месте, где проверяется while PIR1bits.SSP1IF==0. Я уже везде был, кучу форумов перерыл. Уже попробовал всё, что мог представить. Я довольно новый в мире PIC, хотел попробовать их, а они ужасно сопротивляются. Уже 2 недели долблюсь безуспешно.
      Подтяжки 10к, проблем с ними никогда не было.
      Собственно, вот код (я уже там попробовал повыключать ADC, вычитал про баг, что сначала I2C пины надо делать OUTPUT LOW, а потом уже INPUT из-за бага MSSP, но ничего не помогло).
      // PIC16F18326 Configuration Bit Settings // 'C' source line config statements // CONFIG1 #pragma config FEXTOSC = OFF // FEXTOSC External Oscillator mode Selection bits (Oscillator not enabled) #pragma config RSTOSC = HFINT32 // Power-up default value for COSC bits (HFINTOSC with 2x PLL (32MHz)) #pragma config CLKOUTEN = OFF // Clock Out Enable bit (CLKOUT function is disabled; I/O or oscillator function on OSC2) #pragma config CSWEN = ON // Clock Switch Enable bit (Writing to NOSC and NDIV is allowed) #pragma config FCMEN = ON // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled) // CONFIG2 #pragma config MCLRE = ON // Master Clear Enable bit (MCLR/VPP pin function is MCLR; Weak pull-up enabled) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config WDTE = OFF // Watchdog Timer Enable bits (WDT disabled; SWDTEN is ignored) #pragma config LPBOREN = OFF // Low-power BOR enable bit (ULPBOR disabled) #pragma config BOREN = ON // Brown-out Reset Enable bits (Brown-out Reset enabled, SBOREN bit ignored) #pragma config BORV = LOW // Brown-out Reset Voltage selection bit (Brown-out voltage (Vbor) set to 2.45V) #pragma config PPS1WAY = ON // PPSLOCK bit One-Way Set Enable bit (The PPSLOCK bit can be cleared and set only once; PPS registers remain locked after one clear/set cycle) #pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable bit (Stack Overflow or Underflow will cause a Reset) #pragma config DEBUG = OFF // Debugger enable bit (Background debugger disabled) // CONFIG3 #pragma config WRT = OFF // User NVM self-write protection bits (Write protection off) #pragma config LVP = ON // Low Voltage Programming Enable bit (Low Voltage programming enabled. MCLR/VPP pin function is MCLR. MCLRE configuration bit is ignored.) // CONFIG4 #pragma config CP = OFF // User NVM Program Memory Code Protection bit (User NVM code protection disabled) #pragma config CPD = OFF // Data NVM Memory Code Protection bit (Data NVM code protection disabled) // #pragma config statements should precede project file includes. // Use project enums instead of #define for ON and OFF. #include <xc.h> #include <htc.h> #include <stdio.h> #include <stdint.h> #define _XTAL_FREQ 32000000 void i2c_is_idle(void){ //while(!PIR1bits.SSP1IF); //while(SSPCON2bits.SEN==1 || SSPCON2bits.RSEN==1 || SSPCON2bits.PEN==1 || SSPCON2bits.RCEN==1 || SSPCON2bits.ACKEN==1 || SSPSTATbits.R_nW==1){}; while(PIR1bits.SSP1IF == 0){ PORTCbits.RC2=1; }; // SSP1IF is set when operation complete PORTCbits.RC2=0; PIR1bits.SSP1IF = 0; // clear interrupt flag } void i2c_start(void){ i2c_is_idle(); SSPCON2bits.SEN = 1; } void i2c_rep_start(void){ i2c_is_idle(); SSPCON2bits.RSEN = 1; } void i2c_stop(void){ i2c_is_idle(); SSPCON2bits.PEN = 1; } void i2c_write(uint8_t i2c_data){ i2c_is_idle(); SSPBUF = i2c_data; while(SSPSTATbits.BF != 0); while(SSPCON2bits.ACKSTAT != 0); } uint8_t i2c_read(uint8_t ack){ uint8_t recieve =0; i2c_is_idle(); SSPCON2bits.RCEN = 1; while(SSPSTATbits.BF != 1); recieve = SSPBUF; SSPCON2bits.ACKEN = ack; return recieve; } void i2c_init(void){ TRISCbits.TRISC0 = 1; TRISCbits.TRISC1 = 1; SSPSTATbits.SMP = 1; SSPSTATbits.CKE = 0; SSPCONbits.SSPM = 0x08; SSPADD = 79; SSPCONbits.SSPEN = 1; } void main(void) { ANSELCbits.ANSC0 = 0; //ADC RC0 OFF ANSELCbits.ANSC1 = 0; //ADC RC1 OFF TRISCbits.TRISC2=0; //LED PIN TRISCbits.TRISC0=0; //MSSP bug counter TRISCbits.TRISC1=0; //MSSP bug counter //__delay_ms(5); LATCbits.LATC1=0; //MSSP bug counter LATCbits.LATC0=0; //MSSP bug counter //__delay_ms(5); INTCONbits.GIE=1; //global interrupt en INTCONbits.PEIE=1; //peripheral interrupt en ADCON0bits.ADON=0; //unpower adc just in case i2c_init(); //THIS SETS TRISC BITS FOR SCL SDA while(1){ i2c_start(); i2c_write(0x3C); i2c_stop(); } return; } Задача: просто увидеть коммуникацию на SCL SDA, я уже потом по даташитам таргет девайсов без проблем напишу дрова. Не получается именно осуществлять коммуникацию.
      Подскажите, пожалуйста, я не понимаю, где я дурак, а между тем волос на голове становится всё меньше, а те, что остались, стремительно приобретают серый окрас, ибо 2 недели я долбаюсь с одной проблемой. Благодарю за ваши советы. Спасибо.
       
    • By Николай кол
      Привет, у меня есть вопрос, как передать данных с микроконтроллера pic через блютуз модуль HC-05 на телефон в виде графика.Не могли бы вы показать скрипт или статю.Про Arduino много а про pic не (нужно передать данные с микроконтроллера на телефон а не на оборот).У же есть приложение на app inventor 2.Нужно примерно как тут https://www.youtube.com/watch?v=WzoCQ2fRsRQ
    • By duty
      Привет, участникам форума! Подскажите, пожалуйста, как можно реализовать связь микроконтроллера pic с адресным ключом (ds2405 или ds2408) по 1-wire (на шине будут висеть несколько ключей)  для считывания pio ключа, во входном режиме, т.е на pio поступает сигнал  с магнитоконтактного датчика о срабатывание его или нет.    Datasheet читал, но мало чего понял.  Тестирование произвожу в proteus 8.6
    • By Максим123456789
      делаю диплом, в схеме у меня микроконтроллер PIC16F688 и мне нужно его заменить на ATmega. Не могу найти похожий
×
×
  • Create New...