用PIC单片机控制直流电机的嵌入式C代码
我试图创建一个嵌入式c代码,用PIC32MX460F512L微控制器控制直流电机。我将系统时钟配置为80MHz,外围时钟配置为10MHz,Am使用定时器1以给定占空比脉冲PWM,定时器2以测量电机运行时间。我有一个头文件(includes.h),其中包含系统配置信息,例如时钟。我创建了大多数函数,但有些函数有点挑战性。例如,初始化LED以及向前、向后移动和停止功能时,我希望直流电机在70%占空比下向前运行4秒,然后停止1秒,然后在50%占空比下反转3秒,然后停止1秒,然后在40%占空比下再次向前运行3秒,停止1秒,最后在20%占空比下向前5秒。对前进、停止和后退功能有何建议用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%占空比下再次向前
#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。无论如何,感谢您提供的信息。让我详细研究一下,看看会有什么结果