Hello again everyone. I have not been on in a long time. I have new project I'm working on and can't seem to get the solution I'm looking for. Bascially it is suppose to set one of 3 DC for the PWM, and continuously re-locate the motor based on the position of some other pieces. I try to set up the PW registers at the start and only monitor the DC (Duty Cycle) and direction throughout the rest of the code. I'm using a PIC16F684 and would like to stick with registers and not hpwm. Mister E thank you for your simple yet great multi-calc program. I also double checked all of the register values before using them so I know they are correct. Here are the things I'm noticing with this software.
1. The frequency the PWM is running at is suppose to be 8kHz and is only at 4kHz.
2. The DC only works in the middle range, below shown as 717. Surrounding values do not work.
3. Sometimes it seems as if there are sections of 0% DC popping up.
Below I tried to give as much of the code as I could without getting to long. I've read through the data sheet and app notes many time now and can't seem to find where I'm messing this up. Is it possible I'm trying to update the DC to quickly? Any help from anyone is greatly appreciated, please ask me if you need any more information. I can post the entire code if anyone needs it.
My test is just on the chip with a scope, telling the motor to go to a point it can never reach. This should give me a constant set of pulses at the same DC forever. I have a pot conected to ADCIN 5 to change the DC but like I said before when I move out of the mid range the signal out drops to 0% DC.
Code:'-------------------------------------------------------------------------' ' Hardware Defines Specific to PIC Basic Pro ' '-------------------------------------------------------------------------' define ADC_BITS 10 'Set A/D coverter to use 10 bits define ADC_SAMPLEUS 50 'Set A/D sample time as 50us DEFINE OSC 8 'Change clock speed to 8Mhz '-------------------------------------------------------------------------' ' Initialise PIC Hardware ' '-------------------------------------------------------------------------' CMCON0 = 7 'Turn comparators off ANSEL = %00110111 'Turn on select analog registers TRISA = %00001111 'Turn on select register inputs TRISC = %00111111 'Turn on select register inputs ADCON0.7 = 1 'Set A/D Values to be right justified ADCON0.0 = 1 'Turn on A/D Converter PR2 = 249 CCP1CON = %11001100 CCPR1L = 0 PIR1.1 = 0 T2CON.0 = 0 T2CON.1 = 0 T2CON.2 = 1 WHILE (PIR1.1 = 0) WEND; TRISC.5 = 0 TRISC.4 = 0 TRISC.3 = 0 TRISC.2 = 0 Main: ADCIN 5, Speed Speed.lowbyte = ADRESL Speed.highbyte = ADRESH IF (Speed > AnalogLow) & (Speed < AnalogHigh) THEN DUTY = 717 ENDIF IF (Speed < AnalogLow) THEN DUTY = 512 ENDIF IF (Speed > AnalogHigh) THEN DUTY = 922 ENDIF . .. .... (To much to insert here) ....... .......... TimeToMove: ADCIN 2, Position Position.LowByte = ADRESL Position.HighByte = ADRESH If (Position < Seeking + 10) OR (Position > Seeking - 10) THEN DUTY = 0 CCP1CON.4 = DUTY.0 CCP1CON.5 = DUTY.1 CCPR1L = DUTY >> 2 Goto Main ELSE IF (Position > Seeking + 10) THEN CCP1CON.7 = 1 CCP1CON.4 = DUTY.0 CCP1CON.5 = DUTY.1 CCPR1L = DUTY >> 2 GOTO MAIN ENDIF IF (Position < Seeking - 10) THEN CCP1CON.7 = 0 CCP1CON.4 = DUTY.0 CCP1CON.5 = DUTY.1 CCPR1L = DUTY >> 2 Goto Main ENDIF ENDIF GOTO Main




Bookmarks