2016-02-17 72 views
0

我試圖用PIC32MX460F512L微控制器創建嵌入式c代碼來控制直流電機。 Ive配置系統時鐘爲80MHz,外設時鐘爲10MHz,Am使用定時器1以給定佔空比脈衝PWM,定時器2用於測量電機運行時間。我有一個包含系統配置信息(例如時鐘)的頭文件(includes.h)。我創造了大部分功能,但有些有些具有挑戰性。例如,初始化LEDS以及正向,反向運動和停止功能,我希望直流電機以70%佔空比向前運行4秒,然後停止1秒,然後在50%佔空比下反向運行3秒循環,然後停止1秒,然後以40%佔空比再次向前3秒,停止1秒,最後以20%佔空比向前轉5秒。對於提出任何建議,停止和扭轉功能使用PIC微控制器控制直流電機的嵌入式C代碼

#include <stdio.h> 
#include <stdlib.h> 
#include <includes.h> 

void main() 
{ 
    // Setting up PIC modules such as Timers, IOs OCs,Interrupts, ... 
    InitializeIO(); 
    InitializeLEDs(); 
    InitializeTimers(); 

    while(1) { 
     WaitOnBtn1(); 
     Forward(4.0,70); 
     Stop(1.0); 
     Backward(3.0,50); 
     Stop(2); 
     Forward(3.0,40); 
     Stop(1.0); 
     Backward(2.0,20); 
     LEDsOFF(); 
    } 
    return; 
} 

void InitializeIO(){ 
    TRISAbits.TRISA6 = 1; 
    TRISAbits.TRISA7 = 1; 
    TRISGbits.TRISG12 = 0; 
    TRISGbits.TRISB13 = 0; 
    LATGbits.LATB12 = 0; 
    LATGbits.LATB13 = 0; 
    return; 
} 

void InitializeLEDs(){ 
    //code to initialize LEDS 
} 

void InitializeTimers(){ 
    // Initialize Timer1 
    T1CON = 0x0000; // Set Timer1 Control to zeros 
    T1CONbits.TCKPS=3; // prescale by 256 
    T1CONbits.ON = 1; // Turn on Timer 
    PR1= 0xFFFF; // Period of Timer1 to be full 
    TMR1 = 0; // Initialize Timer1 to zero 
    // Initialize Timer2 
    T2CON = 0; 
    T2CONbits.TCKPS = 7; // prescale by 256 
    T2CONbits.T32 = 1; // use 32 bits timer 
    T2CONbits.ON = 1; 
    PR2 = 0xFFFFFFFF; // Period is set for 32 bits 
    TMR2 = 0; 
} 

void WaitOnBtn1(){ 
    // wait on Btn1 indefinitely 
    while(PORTAbits.RA6 == 0); 

    // Turn On LED1 indicating it is Btn1 is Pushed 
    LATBbits.LATB10 = 1; 
    return; 
} 

void Forward(float Sec, int D){ 
    int RunTime = (int)(Sec*39000); // convert the total 
    time to number of Tics 
    TMR2 = 0; 
    //LEDs 
    LATGbits.LATG12 = 1; // forward Direction 
    LATBbits.LATB12 = 0; 
    LATBbits.LATB13 = 0; 
    LATBbits.LATB11 = 1; 
    // Keep on firing the PWM as long as Run time is not 
    elapsed 
    while (TMR2 < RunTime){ 
     PWM(D); 
    } 
    return; 
} 

void PWM(int D){ 
    TMR1 = 0; 
    int Period = 400; 
    while (TMR1< Period) { 
     if (TMR1 < Period*D/100){ 
      LATGbits.LATG13 = 1; 
     } 
     else{ 
     LATGbits.LATG13 = 0; 
    } 
} 
+1

建議?首先問一個問題。 –

+1

1)C不支持_methods_。 2)學習[問] 3)正確格式化並縮進你的代碼。 4)使用原型風格的函數聲明。 – Olaf

+0

對不起,我的意思是功能;我將嘗試在未來更好地格式化我的代碼,但同時提供任何建議 – Chogo

回答

0

功能,而不是方法,要精確。

那究竟是什麼問題?

我可以快速瀏覽上的源代碼,說:你在InitializeIO()函數沒有

LED的初始化應該做的。只需將適當的TRISx位設置爲0,即可將LED引腳配置爲輸出。

對於PWM和電機控制功能,您應該花一些時間並嘗試瞭解內置PWM外設的工作原理。它是OC(輸出比較)的一部分,使用非常簡單。我想請看看使用內置外設庫https://electronics.stackexchange.com/questions/69232/pic32-pwm-minimal-example

基本上你需要設置OC註冊「使」 OC模塊的作用就像PWM以下鏈接http://ww1.microchip.com/downloads/en/DeviceDoc/61111E.pdf

,這一個是最小的實現。您需要分配一個定時器來與OC模塊一起工作(它將用於基本PWM頻率),就是這樣。

您所需要的就是通過設置定時器PRx寄存器來設置PWM佔空比值,您不需要像在PWM例程中那樣交換位。

要停止它簡單停止它只需禁用計時器。

要再次運行,請運行計時器。

要改變方向(這取決於你的驅動器的電機)我想你只需要切換方向引腳。

我希望它可以幫助...

+0

對不起,混淆了有方法和功能;我沉迷於Java。無論如何感謝您的信息。讓我研究一下細節,看看會發生什麼 – Chogo