Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用PIC单片机控制直流电机的嵌入式C代码_C_Embedded_Pic - Fatal编程技术网

用PIC单片机控制直流电机的嵌入式C代码

用PIC单片机控制直流电机的嵌入式C代码,c,embedded,pic,C,Embedded,Pic,我试图创建一个嵌入式c代码,用PIC32MX460F512L微控制器控制直流电机。我将系统时钟配置为80MHz,外围时钟配置为10MHz,Am使用定时器1以给定占空比脉冲PWM,定时器2以测量电机运行时间。我有一个头文件(includes.h),其中包含系统配置信息,例如时钟。我创建了大多数函数,但有些函数有点挑战性。例如,初始化LED以及向前、向后移动和停止功能时,我希望直流电机在70%占空比下向前运行4秒,然后停止1秒,然后在50%占空比下反转3秒,然后停止1秒,然后在40%占空比下再次向前

我试图创建一个嵌入式c代码,用PIC32MX460F512L微控制器控制直流电机。我将系统时钟配置为80MHz,外围时钟配置为10MHz,Am使用定时器1以给定占空比脉冲PWM,定时器2以测量电机运行时间。我有一个头文件(includes.h),其中包含系统配置信息,例如时钟。我创建了大多数函数,但有些函数有点挑战性。例如,初始化LED以及向前、向后移动和停止功能时,我希望直流电机在70%占空比下向前运行4秒,然后停止1秒,然后在50%占空比下反转3秒,然后停止1秒,然后在40%占空比下再次向前运行3秒,停止1秒,最后在20%占空比下向前5秒。对前进、停止和后退功能有何建议

#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;
    }
}
#包括
#包括
#包括
void main()
{
//设置PIC模块,如定时器、IOs OCs、中断等。。。
InitializeIO();
初始化项();
初始化剂();
而(1){
WaitOnBtn1();
前进(4.0,70);
停止(1.0);
向后(3.0,50);
停止(2);
前进(3.0,40);
停止(1.0);
向后(2.0,20);
LEDsOFF();
}
返回;
}
void InitializeIO(){
TRISAbits.TRISA6=1;
TRISAbits.TRISA7=1;
TRISGbits.TRISG12=0;
TRISGbits.TRISB13=0;
LATGbits.LATB12=0;
LATGbits.LATB13=0;
返回;
}
void InitializeLEDs(){
//初始化LED的代码
}
无效初始值设定项(){
//初始化计时器1
T1CON=0x0000;//将Timer1控件设置为零
T1CONbits.TCKPS=3;//按256预缩放
T1CONbits.ON=1;//打开计时器
PR1=0xFFFF;//计时器1的周期已满
TMR1=0;//将计时器1初始化为零
//初始化计时器2
T2CON=0;
T2CONbits.TCKPS=7;//按256预缩放
T2CONbits.T32=1;//使用32位计时器
T2CONbits.ON=1;
PR2=0xFFFFFF;//周期设置为32位
TMR2=0;
}
void WaitOnBtn1(){
//无限期等待Btn1
而(PORTAbits.RA6==0);
//打开LED1,表示按下了Btn1
LATBbits.LATB10=1;
返回;
}
远期无效(浮动秒,整数D){
int运行时=(int)(秒*39000);//转换总数
抽搐次数的时间
TMR2=0;
//发光二极管
LATGbits.LATG12=1;//正向
LATBbits.LATB12=0;
LATBbits.LATB13=0;
LATBbits.LATB11=1;
//只要运行时间不长,就继续启动PWM
逝去
while(TMR2<运行时){
PWM(D);
}
返回;
}
无效脉宽调制(int D){
TMR1=0;
整数周期=400;
而(TMR1<周期){
如果(TMR1<周期*D/100){
LATGbits.LATG13=1;
}
否则{
LATGbits.LATG13=0;
}
}

准确地说,是函数,而不是方法

那么问题到底是什么呢

通过快速查看源代码,我可以说:

LED初始化应该像在InitializeIO()函数中那样进行。只需将适当的TRISx位设置为0,即可将LED引脚配置为输出

对于PWM和电机控制功能,您应该花一些时间了解内置PWM外围设备的工作原理。它是OC(输出比较)的一部分,非常易于使用。请查看以下链接

这是一个使用内置外围库的最小实现

基本上,您需要设置OC寄存器以“使”OC模块像PWM一样工作。您需要分配一个定时器来与OC模块一起工作(它将用于基本PWM频率),就是这样

之后您只需通过设置定时器PRx寄存器来设置PWM占空比值,无需像PWM例程中那样交换位

要停止它,只需禁用计时器即可

要再次运行,请运行计时器

要改变方向(这取决于你的驱动器的电机),我想你只需要切换方向针


我希望这有帮助…

建议?首先问一个问题。1)C不支持方法。2)学习3)正确设置代码格式和缩进。4)使用原型样式的函数声明器。对此我很抱歉,我是指函数;我将来会尝试更好地设置代码格式,但同时任何建议如果没有示意图,就无法说明任何事情。有了这个原理图,它将更加适合我实际从事的计算机科学,代码是在mplab x ide和proteusSorry中模拟的,因为混合了方法和函数;我沉迷于java。无论如何,感谢您提供的信息。让我详细研究一下,看看会有什么结果