📄 dcm.c
字号:
ADCON1bits.FORM = 3; //有符号小数(DOUT = sddd dddd dd00 0000)
ADCON1bits.SSRC = 3; //通过电机控制PWM间隔结束采样并开始转换
ADCON1bits.SIMSAM = 1; //同时采样CH0、CH1、CH2 和CH3 (当CHPS = 1x时)
//或
//同时采样CH0 和CH1 (当CHPS = 01 时)
ADCON1bits.ASAM = 1; //采样在上一次转换结束后立即开始。SAMP 位自动置位
ADCON1bits.SAMP = 1; //至少一个A/D 采样/保持放大器正在采样
ADCON2 = 0;
ADCON2bits.CHPS = 2; //转换CH0、CH1、CH2 和CH3
ADCON3 = 0;
ADCON3bits.ADCS = 7; //A/D 转换时钟选择位 = 4 * Tcy
ADCHS = 0;
ADCHSbits.CH0SA = 6;
ADCHSbits.CH123SA = 0; //CH1正输入为AN0, CH2 正输入为AN1,CH3正输入为AN2
ADPCFG = 0xFFFF; //将所有端口设置为数字端口
ADPCFGbits.PCFG0 = 0; // AN0 模拟
ADPCFGbits.PCFG1 = 0; // AN1 模拟
ADPCFGbits.PCFG2 = 0; // AN2 模拟
ADCSSL = 0;
ADCON1bits.ADON = 1; //开启A/D 模块
// ------------- 编码器 -----------------
MAXCNT = diMAXCNTS; //MAXCNT = 4096
QEICON = 0;
POSCNT = 0;
QEICONbits.QEIM = 7; //正交编码器接口使能(x4 模式),通过与(MAXCNT)匹配将位置计数器复位
QEICONbits.POSRES = 0; //索引脉冲不能使位置计数器复位
QEICONbits.SWPAB = 1;
DFLTCON = 0;
// ------------ 输入捕捉和变化通知 ------------------
TRISB |= 0x38; //
CNPU1 = 0; //
CNEN1 = 0x20; // Enable CN5
// ------------- 端口------------------
TRISBbits.TRISB8 = 0;
TRISBbits.TRISB7 = 0;
TRISBbits.TRISB6 = 0; //LED端口初始化为输出模式
TRISCbits.TRISC14 = 1; //此端口配合CN5,用来判断方向盘的旋转方向
}
void RunMotor(void)
{
// Clear all interrupts flags
IFS0bits.CNIF = 0; // Clear interrupt flag
IFS0bits.ADIF = 0; // Clear ISR flag
//IFS2bits.QEIIF = 0; // Clear ISR flag
// enable all interrupts
__asm__ volatile ("DISI #0x3FFF");
//IEC0bits.T1IE = 1; // Enable interrupts for timer 1
IEC0bits.CNIE = 1; // Enable interrupts on CN5
//IEC2bits.QEIIE = 1; // Enable interrupts on IC8
IEC0bits.ADIE = 1; // Enable interrupts
DISICNT = 0;
return;
}
//===========================================================
//名称: void init_led(void)
///
//说明:初始化LED和按键端口
//===========================================================
void Init_LedPort(void)
{
TRISDbits.TRISD1 = 0;
TRISDbits.TRISD2 = 0;
TRISDbits.TRISD3 = 0; //数据发送端口方向
TRISEbits.TRISE2 = 0;
TRISEbits.TRISE3 = 0;
TRISEbits.TRISE4 = 0; //
TRISEbits.TRISE5 = 0; //控制位
}
//=========================================================
//名称:take_data
//描述:取字符代码子程序,从字库中取出字符代码
//入口参数:i为显示缓存中的第某位数据
//=========================================================
void take_data(unsigned char i)
{
unsigned char j;
j = Led_Show_Buf[i] ; //取显示缓存的某位数据
Led_Show_Data=ledtable[j]; //从led字符表中查找对应的字符编码
}
void Dec_ShowBuf( int i)
{
if(i<0)
{
i = -i;
LATBbits.LATB7 = 0;
}
else
LATBbits.LATB7 = 1;
Led_Show_Buf[3]=i%10; //个位
if(i>9)
{
Led_Show_Buf[2]=(i%100)/10; //十位
if(i>99)
{ //
Led_Show_Buf[1]=(i%1000)/100; //百位
if(i>999)
{
Led_Show_Buf[0]=i/1000; //
}
else
{
Led_Show_Buf[0]=10; //
}
}
else
{
Led_Show_Buf[1]=10; //显示空白
Led_Show_Buf[0]=10; //显示空白
}
}
else
{
Led_Show_Buf[2] = 10; //显示空白
Led_Show_Buf[1] = 10; //显示空白
Led_Show_Buf[0] = 10; //显示空白
}
}
//=============================================================
//名称:send_data
//
//=============================================================
void send_leddata(unsigned char c)
{
unsigned char j;
SP_RCLK = 0; //PORTDbits.RD2 = 0;
SP_SRCLK = 0; //PORTDbits.RD3 = 0;
for(j=8;j>0;j--)
{
if(c & 0x01)
SP_DAT = 1; //PORTDbits.RD1 = 1;
else
SP_DAT = 0; //PORTDbits.RD1 = 0;
c = c >> 1;
SP_SRCLK = 1; //PORTDbits.RD2 = 1;
Nop();
SP_SRCLK = 0; //PORTDbits.RD2 = 0;
}
SP_RCLK = 1; //PORTDbits.RD3 = 1;
Nop();
SP_RCLK = 0; //PORTDbits.RD3 = 0;
}
void delay(unsigned int i)
{
while(i)
{i--;}
}
//==========================================================
//名称:led_refresh
//描述:led刷新子程序,对led各显示位刷新一次
//说明:局部变量i控制对某位的刷新显示
//==========================================================
void led_refresh(void)
{
delay(1000);
switch(Nwei_Show)
{
case 0:
PORTE = PORTE | 0x3c; //先熄灭控制位
take_data(0);
send_leddata(Led_Show_Data);
Led_WX1 = 0; // PORTEbits.RE5 = 0;
break;
case 1:
PORTE = PORTE | 0x3c; //先熄灭控制位
take_data(1);
send_leddata(Led_Show_Data);
Led_WX2 = 0; //PORTEbits.RE4 = 0;
break;
case 2:
PORTE = PORTE | 0x3c; //先熄灭控制位
take_data(2);
send_leddata(Led_Show_Data);
Led_WX3 = 0;
break;
case 3:
PORTE = PORTE |0x3c; //先熄灭控制位
take_data(3);
send_leddata(Led_Show_Data);
Led_WX4 = 0;
break;
}
if(Required_Direction == CW)
{
LATBbits.LATB6 = 0;
}
else
LATBbits.LATB6 = 1;
Nwei_Show ++;
if(Nwei_Show == 4)
Nwei_Show=0;
}
int main(void)
{
InitUserParms();
SetupPeripherals(); //外设初始化
Init_LedPort();
RunMotor();
//PDC1 =1600;
//delay(60000);
//delay(60000);
//delay(60000);
//delay(60000);
//PDC1 =1800;
//delay(60000);
//delay(60000);
//delay(60000);
//PDC1 =2500;
//ReadADC0(&ReadADCParm);
//CalcVel();
//PIParmVelocity.qInErr = -2000;
while(1)
{
//CalcVelIrp();
//CalcPosPI(&PIParmPosition);
//CalcPosPI(&PIParmVelocity);
//CalcVel();
//InitCalcAng();
//CalcAng();
//PDC1 = (((long)PIParmVelocity.qOut * (long)PTPER * 2)>>15);
k = EncoderParm.qWheelMechAng;
k *= 3000;
k /= 32768;
a = k;
a = 32700;
b = -3270;
c = a - b;
//CalcTimes();
//CalcAngIrp();
//POSCNT
//PIParmVelocity.qOut
//PIParmVelocity .qInRef
//PIParmVelocity.qInMeas
//adshow
//EncoderParm.iIndexCnt
//EncoderParm.qWheelMechAng
//EncoderParm.qMotorVelMech
//PIParmPosition.qInErr
Dec_ShowBuf(EncoderParm.iSteerCnt);// PIParmVelocity.qInRef
led_refresh();
//pinLED2 = 1;
//LATBbits.LATB8 = 1;
//LATBbits.LATB7 = 0;
//LATBbits.LATB6 = 1;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -