Отговори на тема  [ 14 мнения ] 
Играчка закачка с PIC16F887 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Яну 20, 2015 11:26 pm
Мнения: 23
Местоположение: Габрово/Любимец
Мнение Играчка закачка с PIC16F887
Привет на всички. Нов съм във форума и ако правя грешно моля да ми кажете за да се поправя. Начинаещ съм със Microchip микроконтролерите имам повече опит със Arduino средата та стига съм ви занимавал с мен. Имам задача с въпросния контролер която се състой в следното, с два потенциометъра да задавам честота на два канала. Аз използвах един таймер но може й двата да се използват. Програмата която успях да сътворя работи но честотата се изменя по логаритмичен закон а на мен ми трябва да е линейно. давам кода който съм сътворил й моля кажете от къде идва това явление и как да го оправя.
Поздрави Деян.

Код:
void interrupt MainIsr (void)
{
    //Опит само със един таймер да работят и двата канала
    unsigned int uiWork;
    if (TMR1IF)         //Timer 1 interrupt - stepper control
    {
        TMR1IE  = FALSE;    //Disable timer 1 interrupt
        TMR1IF  = FALSE;    //Clear interrupt flag
        DIR2    = TRUE;     //painter spin is always negative
       
        uiWork = (1024-uiPot1) >> 3;
        if (++uiCnt1 > uiWork)
        {
            STEP    = TRUE ;     //Generate pulse for the RC2
            uiCnt1  = 0;
        }

        uiWork = (1024 - uiPot2) >> 2;
        if (++uiCnt2 > uiWork)
        {
            STEP2    = TRUE ;     //Generate pulse for the RC0
            uiCnt2  = 0;
        }

        TMR1L   = MAX_SPEED;// (unsigned char)(uiSpeedScaled);
        TMR1H   = MAX_SPEED>>8;//(unsigned char)(uiSpeedScaled>>8);
//End Speed controller
        TMR1IE  = TRUE;         //Enable the timer 1 interrupt again
        STEP    = FALSE;       //reset the step signal - one pulse generated
        STEP2   = FALSE;        //reset the step signal - one pulse generated

}//of main interrupt service routine


Сря Яну 21, 2015 1:19 am
Профил
Ранг: Ориентиран
Ранг: Ориентиран
Аватар

Регистриран на: Сря Фев 08, 2006 3:32 pm
Мнения: 253
Местоположение: Благоевград
Мнение Re: Играчка закачка с PIC16F887
А сигурен ли си дали потенциометрите не са логаритмични ?


Сря Яну 21, 2015 10:05 am
Профил
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Чет Окт 06, 2005 2:06 pm
Мнения: 194
Местоположение: Sofia
Мнение Re: Играчка закачка с PIC16F887
Нормално да е така. Задаваш периода пропорционално на напрежението, а ти трябва честотата. За да го направиш, първо от напрежението сметни нужната ти честота, а след това периода за тази честота. И тъй като ще има и деление, не е подходящо за този процесор сметките да ги правиш в прекъсването, а в главната програма.


Сря Яну 21, 2015 10:24 am
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Яну 20, 2015 11:26 pm
Мнения: 23
Местоположение: Габрово/Любимец
Мнение Re: Играчка закачка с PIC16F887
Потенциометрите са линейни. Да аз променям периода защото не е важно колко е продължителноста на импусите. Важно е да не се изменя логаритмично периода и със прескачания между отделните честоти (колкото се може по плавно да става). Опитах се да направя както каза rumen65 но като преместя изчисленията в майна и не иска изобщо да цъка изхода.


Сря Яну 21, 2015 4:35 pm
Профил
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Чет Окт 06, 2005 2:06 pm
Мнения: 194
Местоположение: Sofia
Мнение Re: Играчка закачка с PIC16F887
Последно, кое трябва да се променя линейно - периода или честотата. Защото връзката между тях не е линейна F=1/T. Ако едното се променя линейно, другото няма.


Прикачени файлове:
func1x.gif
func1x.gif [ 3.76 KiB | Прегледано 5817 пъти ]
Сря Яну 21, 2015 5:01 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Яну 20, 2015 11:26 pm
Мнения: 23
Местоположение: Габрово/Любимец
Мнение Re: Играчка закачка с PIC16F887
Периода трябва да се изменя линейно.


Сря Яну 21, 2015 5:29 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Чет Юни 25, 2009 1:01 pm
Мнения: 2251
Мнение Re: Играчка закачка с PIC16F887
По-скоро мисля, че имаш проблем с програмата, а не с алгоритъма, след като изобщо не иска да цъка!
А може и с двете! Пусни един дебъгер и виж какво става!

_________________
www.elkran.com


Сря Яну 21, 2015 10:46 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 25, 2012 9:14 am
Мнения: 5298
Мнение Re: Играчка закачка с PIC16F887
Според това което си дал импулсите STEP които генерираш ще са дълги по няколко наносекунди.
Опитай ето така:
Код:
void interrupt MainIsr (void)
{
    //Опит само със един таймер да работят и двата канала
    unsigned int uiWork;
    if (TMR1IF)         //Timer 1 interrupt - stepper control
    {
        TMR1IF  = FALSE;    //Clear interrupt flag
        DIR2    = TRUE;     //painter spin is always negative

        TMR1L   = MAX_SPEED;// (unsigned char)(uiSpeedScaled);
        TMR1H   = MAX_SPEED>>8;//(unsigned char)(uiSpeedScaled>>8);
         
        uiWork = (1024-uiPot1) >> 3;
        if (++uiCnt1 > uiWork)
        {
            STEP    = TRUE ;     //Generate pulse for the RC2
            uiCnt1  = 0;
        } else STEP    = FALSE;       //reset the step signal - one pulse generated

        uiWork = (1024 - uiPot2) >> 2;
        if (++uiCnt2 > uiWork)
        {
            STEP2    = TRUE ;     //Generate pulse for the RC0
            uiCnt2  = 0;
        } else STEP2   = FALSE;        //reset the step signal - one pulse generated

        TMR1IE  = TRUE;         //Enable the timer 1 interrupt again
    }
}//of main interrupt service routine

_________________
'просто' е технически синоним на 'красиво'


Сря Яну 21, 2015 11:14 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 20, 2005 12:02 pm
Мнения: 9119
Местоположение: Разград
Мнение Re: Играчка закачка с PIC16F887
Точно така се получава. Скоро правих абсолютно същата постановтка. Просто си сметнах една табличка в ексел с 1024 стойности и чета от нея периода. По късно ще дам подробности, че сега пиша от телефона.


уф... чак сега успях да седна на нормална клавиатура...

Значи примерно ей това : 13000000/(200+{adc_input}) дава от около 76 до 470 херца напълно линейно (колкото е възможно при 10 бита де). Аз го направих единия таймер (8 битов) изключва изхода, прелоудва друг 16 битов таймер с някоя от стойностите и го пуска. 16 битовия таймер като изтече включва малкия таймер и съответния изход. На практика малкия таймер, който генерира пулса вкарва лееека нелинейност в честотата. В моя случай се управляват драйвери на стъпкови мотори и мога да си позволя пулса да е много кратък.

В ексела като се поиграе малко с числата могат да се докарат всякакви честоти (е ествествено в рамките на възможностите на таймера), после се вкарват в една таблица и няма никакъв овърхед от постоянна аритметика.

А за още по-лесно едни от най-новите 16-ки имат NCO - какво повече му трябва на човек :)


Чет Яну 22, 2015 8:18 am
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Авг 15, 2011 5:37 pm
Мнения: 12
Мнение Re: Играчка закачка с PIC16F887
Много сложно ми се вижда решението на толкова проста задача.
Така няма ли да стане.
Всеки път като влизаме в ISR то превключваме състоянието на изхода. Като задаваме стойност на таймера (вътре в ISRто) според прочетената стойност на ADCто променяме периода му на прекъсване. Колкото по висока стойност задаваме на регистрите на таймера толкова по скоро ще настъпи следващото прекъсване респективно ще расте и честотата на изхода.

Код:
void TimerIsr(void)
{
   TMR1IF  = FALSE;
   output_pin ^= 1;                                     // toggle състоянието на изхода
   TMR1L = (adc_value*64) & 0xFF;              //*64 преобразува 10-битова стойност на adc в 16-битова за таймера.
   TMR1H = ((adc_value*64)>>8) & 0xFF;   
}


Нед Яну 25, 2015 2:17 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Яну 20, 2015 11:26 pm
Мнения: 23
Местоположение: Габрово/Любимец
Мнение Re: Играчка закачка с PIC16F887
Точно това правя rikotech но когато започна да увеличавам таимера с потенциометъра изменението на честотата става логаритмично и как да компенсирам това изменение и да се движи линейно честотата


Чет Яну 29, 2015 12:00 pm
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Съб Окт 30, 2004 11:19 pm
Мнения: 609
Мнение Re: Играчка закачка с PIC16F887
най-лесно ми се вижда с таблица, от която при дадена стойност на ацп, взимаш нужната стойност за таймера.


Чет Яну 29, 2015 12:11 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Авг 15, 2011 5:37 pm
Мнения: 12
Мнение Re: Играчка закачка с PIC16F887
Прочети за това:

NUMERICALLY CONTROLLED
OSCILLATOR (NCO) MODULE

можеш да намериш повече инфо тук: http://www.microchip.com/pagehandler/en-us/family/8bit/peripherals/coreindependent/nco-prdpge.html


Съб Яну 31, 2015 9:56 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Яну 20, 2015 11:26 pm
Мнения: 23
Местоположение: Габрово/Любимец
Мнение Re: Играчка закачка с PIC16F887
В крайна сметка го направих с масив от променливи и стана доста гладко.
Но сега имам нова задача да чета един сензор по I2C и успах но когато тръгна да дебъгвам и рестартрам програмата не иска да стартира I2C шината и трябва да спирам захранването. от какво може да е този проблем.


Пон Мар 23, 2015 3:15 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 14 мнения ] 

Кой е на линия

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


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

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