// DSPIC30F4012 Configuration Bit Settings #include #include #pragma config FOSFPR = FRC_PLL4 // Primary Oscillator Mode (FRC w/ PLL 4x) //15.03.2023 #pragma config FCKSMEN = CSW_FSCM_OFF // Clock Switching and Monitor (Sw Disabled, Mon Disabled) #pragma config FWPSB = WDTPSB_16 // WDT Prescaler B (1:16) #pragma config FWPSA = WDTPSA_512 // WDT Prescaler A (1:512) #pragma config WDT = WDT_OFF // Watchdog Timer (Disabled) #pragma config FPWRT = PWRT_64 // POR Timer Value (64ms) #pragma config BODENV = BORV20 // Brown Out Voltage (Reserved) #pragma config BOREN = PBOR_OFF // PBOR Enable (Disabled) #pragma config LPOL = PWMxL_ACT_LO // Low-side PWM Output Polarity (Active low) //15.03.2023 #pragma config HPOL = PWMxH_ACT_HI // High-side PWM Output Polarity (Active High) #pragma config PWMPIN = RST_IOPIN // PWM Output Pin Reset (Control with PORT/TRIS regs) #pragma config MCLRE = MCLR_DIS // Master Clear Enable (Disabled) #pragma config GWRP = GWRP_OFF // General Code Segment Write Protect (Disabled) #pragma config GCP = GSS_OFF // General Segment Code Protection (Disabled) //15.03.2023 #pragma config ICS = ICS_PGD // Comm Channel Select (Use PGC/EMUC and PGD/EMUD) #define FCY 7370000//xtal = 5.0Mhz; PLLx8 #define MILLISEC FCY/10000// 1 mSec delay constant #define FPWM 16000 #define Ksp 1200 #define Ksi 10 #define RPMConstant 60*(FCY/256) #define S2 !PORTCbits.RC14 #define _int __attribute__ ((__interrupt__,__auto_psv__)) void InitADC10(void); void AverageADC(void); void DelayNmSec(unsigned int N); void InitMCPWM(void); struct { unsigned RunMotor : 1; unsigned Minus : 1; unsigned start : 1;//5.4.2015 unsigned flag : 1;//5.4.2015 unsigned unused : 12; } Flags; unsigned int HallValue; int Speed; unsigned int Var; unsigned int Slow;//21.07.2019 unsigned int StateLoTable[] = {0x0000, 0x0108,0x0420, 0x0120, //06.02.2022 bionx rückwärts 0x1002, 0x1008, 0x0402, 0x0000}; void _int _CNInterrupt(void) { IFS0bits.CNIF = 0; // clear flag HallValue = PORTD & 0x00e0; // mask RD5,6 & 7 //15.03.2023 HallValue = HallValue >>5; // shift right 3 times //15.03.2023 /* if (HallValue==5)HallValue = 0; if (HallValue==4)HallValue = 1; if (HallValue==6)HallValue = 3; if (HallValue==2)HallValue = 7; if (HallValue==3)HallValue = 6; if (HallValue==1)HallValue = 4; switch (HallValue) { case 5: HallValue = 1; break; case 4: HallValue = 5; break; case 6: HallValue = 4; break; case 2: HallValue = 6; break; case 3: HallValue = 2; break; case 1: HallValue = 3; break; } */ OVDCON = StateLoTable[HallValue];// Load the overide control register /* if(HallValue == 7)//07.06.2015 Geschwindigkeitsmessung { Var++; if(Var == 3) { LATDbits.LATD0 = 1;//07.06.2015 } if(Var == 6) { Var = 0; LATDbits.LATD0 = 0;//07.06.2015 } }//14.02.2015 * */ } void _int _ADCInterrupt(void) { IFS0bits.ADIF = 0; if(Slow==0)//21.07.2019 { PDC1 = ADCBUF0; PDC2 = PDC1; // and load all three PWMs ... PDC3 = PDC1; // duty cycles } else//21.07.2019 { PDC1 = ADCBUF0/2;//21.07.2019 PDC2 = PDC1; // and load all three PWMs ... PDC3 = PDC1; // duty cycles } } void _int _INT0Interrupt(void)//21.07.2019 { IFS0bits.INT0IF = 0; Slow = 1; //asm ("rlc PDC1"); //asm ("mov SR,w0"); //asm ("btsc SR,#0x00"); //asm ("goto 0x120"); } int main(void) { /* TRISDbits.TRISD1 = 0; //08.05.2015 OC2R = 0x0000; //08.05.2015 PR2 = 0x1fff; //08.05.2015 half time period OC2CON = 0x0003; //08.05.2015 OC-PIN toggels, T2CON = 0x8020; //08.05.2015 T2 on, prescaler 1/64 */ Slow = 0;//22.07.2019 //INTCON2bits.INT0EP = 1; //17.03.2023 //IEC0bits.INT0IE = 1;//21.07.2019 (RE8) Motor zuviel Strom //17.03.2023 //TRISDbits.TISD0 = 0;//21.07.2019 LATE = 0x0015; // 23.03.2023 TRISE = 0xFFC0; // PWMs are outputs // 21.03.2023 CNEN1 = 0xc000; // CN14 and CN15 enabled //15.03.2023 CNEN2 = 0x0001; // CN16 enabled //15.03.2023 //CNPU1 = 0x00E0; // enable internal pullups //disable,because IR-Sensors 25.01.2015 IFS0bits.CNIF = 0; // clear CNIF IEC0bits.CNIE = 1; //enable CN interrupt InitMCPWM(); InitADC10(); while(1)//07.04.2015 { if(ADCBUF0 < 0x000e)//07.04.2015 darf beim Einschalten von Stromquelle nicht anspringen! { break;//07.04.2015 } } while(1) { while(1)//07.04.2015 { if(ADCBUF0 > 0x000f)//07.04.2015 { Slow = 0;//22.07.2019 T2CON = 0; //08.05.2015 OC2CON = 0; //08.05.2015 break; } } DelayNmSec(10); /* 03.05.2015 TMR5 = 0xa000; Flags.start = 1;//5.4.2015 IFS1bits.T5IF = 0;//5.4.2015 T5CON = 0x8020;//5.4.2015 IEC1bits.T5IE = 1;//5.4.2015 8.5.2015 T1CONbits.TON = 1; T1CONbits.TCKPS0 = 1; T1CONbits.TCKPS1 = 1; IEC0bits.T1IE = 1; IFS0bits.T1IF = 0; * 8.5.2015 * */ HallValue = PORTD & 0x00e0; // mask RD5,6 & 7 //17.03.2023 HallValue = HallValue >> 5; // shift right to get value 1, 2 ... 6 //17.03.2023 OVDCON = StateLoTable[HallValue]; // Load the overide control register PWMCON1 = 0x0777; // enable PWM outputs Flags.RunMotor = 1; // set flag DelayNmSec(100);//13.03.2015 FLTACON = 0x0000;//21.07.2019 //vorher 0x0007 //IFS2bits.FLTAIF = 0;//13.03.2015 while (Flags.RunMotor) // while motor is running { /*//21.07.2019 if(IFS2bits.FLTAIF == 1) { PWMCON1 = 0x0700;//13.03.2015 disable PWM outputs OVDCON = 0x0000;//13.03.2015 overide PWM low. Flags.RunMotor = 0;//13.03.2015 reset run flag TRISDbits.TRISD1 = 0; //08.05.2015 OC2R = 0x0000; //08.05.2015 PR2 = 0x1fff; //08.05.2015 OC2CON = 0x0003; //08.05.2015 OC-PIN toggels, T2CON = 0x8020; //08.05.2015 T2 on, prescaler 1/64 //DelayNmSec(600); //13.03.2015 Motor soll bremsen, deshalb Verzögerung 1Sek.???? FLTACON = 0x0000;//13.03.2015 while(1) { if(ADCBUF0 < 0x00e)//07.04.2015 { IFS2bits.FLTAIF = 0;//07.04.2015 T2CON = 0; //08.05.2015 OC2CON = 0; //08.05.2015 TRISDbits.TRISD1 = 1; break;//07.04.2015 } } } */ if(ADCBUF0 < 0x0000e)//07.04.2015 { PWMCON1 = 0x0700; // disable PWM outputs OVDCON = 0x0000; // overide PWM low. Flags.RunMotor = 0; // reset run flag //while (S2) // wait for key release DelayNmSec(10); //DelayNmSec(600);//12.02.2015 Motor soll bremsen, deshalb Verzögerung 1Sek. break; } } } // end of while (1) } void InitADC10(void) { ADPCFG = 0xfbff; // all PORTS = Digital;R10 = analog //16 .03.2023 ADCON1 = 0x0064; //PWM starts conversion ADCON2 = 0x0100;// sample CH0 + CH1 channel //15.03.2023 ADCHS = 0x000a; // Connect RB10/AN10 as CH1 = pot. //15.03.2023 ADCON3 = 0x0080; // Tad = internal RC (4uS) IFS0bits.ADIF = 0; // clear flag IEC0bits.ADIE = 1;// enable interrupt ADCON1bits.ADON = 1; // turn ADC ON } void InitMCPWM(void) { PTPER = FCY/FPWM - 1; PWMCON1 = 0x0700;// disable PWMs PDC1 = 100; // init PWM 1, 2 and 3 to 100 PDC2 = 100; PDC3 = 100; SEVTCMP = PTPER; // special trigger is 16 period values PWMCON2 = 0x0F00; // 16postscale values PTCON = 0x8000; // start PWM } void DelayNmSec(unsigned int N) { unsigned int j; while(N--) for(j=0;j < MILLISEC;j++); }