我用pic16f1937做了一个直流电机控制,用的是AQMD2410NS电机驱动,如图链接
当我给驱动器使能上高电平时,AI2口上低电平时电机并没有正反转,而是非常慢的装,接近于静止。我用RD0~RD2控制使能和AI2,部分程序如下:
void System_Init(void)
{
OSCCON = 0b01101000; //内部4MHz
OSCTUNE= 0b00000000; //出厂校准
ADCON1 = 0b10110000; //内部Frc Vref = VDD
ADCON0 = 0b00010001; //ADON = 1 As AN4
TRISA = 0b00100000; //RA0-RA3输出、RA5输入
ANSELA = 0b00100000; //RA5 模拟输入
TRISB = 0b00000011; //RB0-RB3触摸按键
ANSELB = 0b00000011; //4个触摸按键
WPUB = 0b00000000; //无上拉
IOCBP = 0b00000000; //关电平变化中断
IOCBN = 0b00000000;
TRISD = 0b00000000; //PORTD输出
ANSELD = 0b00000000; //数字输出I/O
//WPUE = 0b00001111;
TRISC = 0b10011000; //串口 I2C
TRISE = 0b00000000; //PORTE输出
ANSELE = 0b00000000; //数字 I/O
WPUE = 0b00000000; //无上拉
LATA = 0x00;
LATB = 0x00;
LATC = 0x00;
LATD = 0x00;
LATE = 0x00;
PORTDbits.RD0=0;//使能初始化为0
PORTDbits.RD1=0;//转速控制初始化为0
PORTDbits.RD2=0;//继电器初始化为0
}
void Cap_ISR(void)
{
KEY_Avg[Index] = Cap_Value;
if (Cap_Value < (Cap_Avg[Index] - trip[Index])) //有键按下,不更新频率平均值
{
switch(Index)
{
case 0: KEY1_FLAG = 1; LATA0 = 1;PORTDbits.RD0=1;PORTDbits.RD1=1;PORTDbits.RD2=1;break; //CSM 0 KEY1 //LATD=0x07;//__delay_ms(10);//
case 1: KEY2_FLAG = 1; LATA1 = 1;PORTDbits.RD0=1;PORTDbits.RD1=0;PORTDbits.RD2=1;break; //CSM 1 KEY2 //LATD=0x05;//__delay_ms(10);//
default : break;//RD0使能控制口,RD1正反向控制口,RD2继电器控制口
}
}
else if (Cap_Value > (Cap_Avg[Index] - trip[Index] +64)) //无键按下,慢更新频率平均值
{
switch(Index)
{
case 0: KEY1_FLAG = 0; LATA0 = 0;PORTDbits.RD0=0;PORTDbits.RD1=0;PORTDbits.RD2=0;break; //CSM 0 KEY1 PORTDbits.RD0=1;PORTDbits.RD1=1
case 1: KEY2_FLAG = 0; LATA1 = 0;PORTDbits.RD0=0;PORTDbits.RD1=0;PORTDbits.RD2=0;break; //CSM 1 KEY2 PORTDbits.RD0=1;PORTDbits.RD1=0
default : break;//D1正反向控制口,RD2继电器控制口
}
if (AvgIndex < 2) AvgIndex ++; //更新频率
else AvgIndex = 0;
if (AvgIndex == 2)
{
if(Cap_Value >= Cap_Avg[Index])
Cap_Avg[Index] = Cap_Avg[Index]+(Cap_Value - Cap_Avg[Index])/16;
else
Cap_Avg[Index] = Cap_Avg[Index]-(Cap_Avg[Index] - Cap_Value)/16;
}
}
}
|