Отговори на тема  [ 4 мнения ] 
PIC16F Software PWM/DIY ESC 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Дек 20, 2016 6:39 pm
Мнения: 32
Местоположение: Русе
Мнение 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.
Моля ако някой е запознат със заданието или има идеи по въпроса да ги сподели. Благодаря предварително!


Съб Дек 01, 2018 3:10 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 8:21 pm
Мнения: 27996
Местоположение: София
Мнение Re: PIC16F Software PWM/DIY ESC
Ами доколкото точно отчитане без точен контрол е малко безмислено според мен трябва да преоритизираш задачите, също като вземеш в предвид и честотата на двата процеса. аз бих сложил PWM д абъде хардуерен, защото няма никаква релана нужда от CCP за точно измерване на период. Също така не е и чак такъв проблем да генерираш 2 khz PWM с приемлив джитер чисто софтуерно, но при всички положение тоа е "по-трудната" задача от двете.
Сега ще ти кажа и защо, когато сетнеш тйамера да генерира PWM с кепчър модула, ти просто го забравяш, той не генерира събития, и нищо не те интересува, като го зареждаш слагаш сетваш променлива и това е.
Да обаче с кепчъра не е така, ако имаш софтуерен PWM ще имаш прекъсване от кепчъра, което ще ти се бута в PWM-а. Да може да го направиш без прекъсване, на полиране, но нямам представа колко често мериш сигнала.
Да не говорим че и двтее може да са чисто софтуерно реализирани, но 8 бита при 2 khz това са 2 us, т.е. на всеки две микро секунди трябва да си проверяваш брояча, иначе няма как да гарантираш точност 8 бита.


Съб Дек 01, 2018 8:35 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Дек 20, 2016 6:39 pm
Мнения: 32
Местоположение: Русе
Мнение 
Това, което ме спира да използвам 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);
}


Съб Дек 01, 2018 10:18 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 8:21 pm
Мнения: 27996
Местоположение: София
Мнение Re: PIC16F Software PWM/DIY ESC
Няма проблем да е чисто софтуерно, въпроса е каква точност ти трябва на мерене и на изхода, може да стане изцяло софтуерно. Да полираш значи да проверяваш, битове, байтове и т.н. Няма голям смисъл да препълваш таймер и да действаш по препълването му, това ще изяде повече код в твоят случай. Настрой си брояча да брои на 1 мкс и проверявай брояча.влизането в прекъсване яде време, дори най-простото прекъсване ти е 4-5 инструкции, т.е. кажи речи 1 us.


Нед Дек 02, 2018 3:13 am
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 4 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 7 госта


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

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни