>我试图创建一个嵌入式c代码,以使用PIC32MX460F512L微控制器控制直流电机。Ive 将系统时钟配置为 80MHz,外设时钟配置为 10MHz,我使用定时器 1 以给定占空比对 PWM 进行脉冲,使用定时器 2 测量电机运行时间。我有一个头文件(include.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;
}
}
准确地说,是函数,而不是方法。
那么问题到底是什么呢?
快速浏览源代码后,我可以说些什么:
LED 初始化应像在 InitializeIO(( 函数中一样完成。只需将适当的 TRISx 位设置为 0,即可将 LED 引脚配置为输出。
对于PWM和电机控制功能,您应该花一些时间尝试了解内置PWM外设的工作原理。它是OC(输出比较(的一部分,非常易于使用。请查看以下链接 http://ww1.microchip.com/downloads/en/DeviceDoc/61111E.pdf
这个用于使用内置外设库的最小实现 https://electronics.stackexchange.com/questions/69232/pic32-pwm-minimal-example
基本上,您需要设置OC寄存器以"使"OC模块像PWM一样工作。您需要分配其中一个定时器来与 OC 模块配合使用(它将用于基本 PWM 频率(,仅此而已。
之后,您所需要的只是通过设置定时器PRx寄存器来设置PWM占空比值,您无需像PWM例程那样交换位。
要停止它,只需禁用计时器即可。
要再次运行它,请运行计时器。
要改变方向(这取决于您的电机驱动程序(,我想您只需要切换方向销。
我希望它有帮助...