Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

PIC16F Software PWM/DIY ESC
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=16249
Страница 1 от 1

Автор:  Nyakоi [ Съб Дек 01, 2018 4:10 pm ]
Заглавие:  PIC16F Software PWM/DIY ESC

Здравейте!
Продължавам започнатия отдавна проект на спийд контролер. Задачата се изразява в измерване на продължителност на импулс между 1000 и 2000uS и генериране на ШИМ сигнал, управляващ H-мост. Първата част от проекта е постигната чрез CCP модул в комбинация с 16-битов таймер.
Разполагайки с 8-битов таймер трябва да генерирам софтуерно PWM с честота около 2Khz, като успоредно с това да променям запълването в зависимост от постъпващия сигнал.
Успях да изпълня до някъде задачата, но прекъсванията на единия таймер забавят другия, което води до смущение в измерването на входните импулси, както и нестабилен коефициент на запълване на PWM-а в сравнение със зададения.
В интернет има релизирани проекти и код, от който не успях да извлека много идеи: http://www.bhabbott.net.nz/esc/bridge.asm
Работя с PIC16F628A. Знам, че може да стане лесно с друг микроконтролер с повече от 1 CCP модула, но към момента не е това идеята. Идеята е да постигна резултат, подобен на добре работещ фабричен контролер, който имам, реализиран с 16F630.
Моля ако някой е запознат със заданието или има идеи по въпроса да ги сподели. Благодаря предварително!

Автор:  ToHu [ Съб Дек 01, 2018 9:35 pm ]
Заглавие:  Re: PIC16F Software PWM/DIY ESC

Ами доколкото точно отчитане без точен контрол е малко безмислено според мен трябва да преоритизираш задачите, също като вземеш в предвид и честотата на двата процеса. аз бих сложил PWM д абъде хардуерен, защото няма никаква релана нужда от CCP за точно измерване на период. Също така не е и чак такъв проблем да генерираш 2 khz PWM с приемлив джитер чисто софтуерно, но при всички положение тоа е "по-трудната" задача от двете.
Сега ще ти кажа и защо, когато сетнеш тйамера да генерира PWM с кепчър модула, ти просто го забравяш, той не генерира събития, и нищо не те интересува, като го зареждаш слагаш сетваш променлива и това е.
Да обаче с кепчъра не е така, ако имаш софтуерен PWM ще имаш прекъсване от кепчъра, което ще ти се бута в PWM-а. Да може да го направиш без прекъсване, на полиране, но нямам представа колко често мериш сигнала.
Да не говорим че и двтее може да са чисто софтуерно реализирани, но 8 бита при 2 khz това са 2 us, т.е. на всеки две микро секунди трябва да си проверяваш брояча, иначе няма как да гарантираш точност 8 бита.

Автор:  Nyakоi [ Съб Дек 01, 2018 11:18 pm ]
Заглавие: 

Това, което ме спира да използвам PWM частта на CCP модула е, че той е закачен за изход RB3 по default, а за H-моста ще ми трябва поне още един изход, за който ще трябва да отговаря част от кода. Също така ще се радвам на малко пояснение какво се има предвид под "полиране", защото в момента не ми говори много.

Текущата идея е да сетна таймер 0 да се препълва на 1 микросекунда, и с брояч и проверки да реализирам PWM-а. Помня от предната тема, че пресетването на TMR0 не е желателно, но така или иначе нулирането (TMR0 = 0) отнема същото процесорно време. Този вариант или дава отклонение в измерването на таймер 1, или цикли постоянно в прекъсването на таймер 0 и въобще не стига до while(1) цикъла в зависимост от това дали има return (в прекъсването на таймер 0 под if-овете).

И все пак остава интересно как са го реализирали за 12F675 като разполагат само с 2 таймера и нито един CCP. Подозирам, че когато мерят постъпващия сигнал прекъсват генерирането на PWM за момент, но това би се отразило осезаемо върху управлявания ел. мотор.

Код:
bit ccpflag;
unsigned long t, counter;

void Interrupt(void) {

if (TMR0IF_bit) {
    TMR0IF_bit = 0;
    TMR0 = 255;
    counter++;
    if(counter == 1) RB4_bit = 1;
    if(counter == 60) RB4_bit = 0; //20% duty cycle
    if(counter == 300) counter = 0; // period = 300uS
    return;
   }

if(CCP1IF_bit){
  if(!ccpflag) {
    ccpflag = 1;
    CCP1CON = 0x4; //falling edge
    TMR1L = 0;
    TMR1H = 0;
    CCP1IF_bit = 0;
    return;
    }
    else {
    t = TMR1H << 8 | TMR1L;
    CCP1CON = 0x5; //rising edge
    CCP1IF_bit = 0;
    ccpflag = 0;
    }
   }
   
}

void main() {
  TRISB4_bit = 0;
 
  OPTION_REG = 0b10001000;
  INTCON = 0b11100000;

  T1CON = 0x1;
  CCP1CON = 0x5;
  PIE1 = 0x4;

  while(1) UART1_Write_Text(t);
}

Автор:  ToHu [ Нед Дек 02, 2018 4:13 am ]
Заглавие:  Re: PIC16F Software PWM/DIY ESC

Няма проблем да е чисто софтуерно, въпроса е каква точност ти трябва на мерене и на изхода, може да стане изцяло софтуерно. Да полираш значи да проверяваш, битове, байтове и т.н. Няма голям смисъл да препълваш таймер и да действаш по препълването му, това ще изяде повече код в твоят случай. Настрой си брояча да брои на 1 мкс и проверявай брояча.влизането в прекъсване яде време, дори най-простото прекъсване ти е 4-5 инструкции, т.е. кажи речи 1 us.

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/