CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

[SOLVED]Motor pwm pair 3 not working
Goto page Previous  1, 2
 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
af19



Joined: 21 Aug 2014
Posts: 15

View user's profile Send private message

PostPosted: Mon Feb 02, 2015 2:24 am     Reply with quote

I put the micro controller on breadboard and there is still a 2.5 V on the PIN B11!! Bummed Out Bummed Out
I think there is a problem with fuse bits.
What do you think is the problem?
Ttelmah



Joined: 11 Mar 2010
Posts: 19552

View user's profile Send private message

PostPosted: Mon Feb 02, 2015 3:38 am     Reply with quote

Pull both pin 14, and pin 15 high externally.
On this chip, the fault inputs wake up enabled, with _pull down_ resistors on them (so they default to the fault condition).

Haven't got this chip, but running it up in MPLAB, I'm seeing the fault condition being permanently triggered, and it won't clear without the pin being driven high before you try to program the PWM. The pin has to be taken high, then the fault condition cleared, and then you can enable the PWM and have it work. I added an external stimulus to take then pins high, and then added code to clear the fault bits, and then programmed the PWM, and it appears the to work.
af19



Joined: 21 Aug 2014
Posts: 15

View user's profile Send private message

PostPosted: Mon Feb 02, 2015 8:33 am     Reply with quote

Ttelmah wrote:
Pull both pin 14, and pin 15 high externally.
On this chip, the fault inputs wake up enabled, with _pull down_ resistors on them (so they default to the fault condition).

Haven't got this chip, but running it up in MPLAB, I'm seeing the fault condition being permanently triggered, and it won't clear without the pin being driven high before you try to program the PWM. The pin has to be taken high, then the fault condition cleared, and then you can enable the PWM and have it work. I added an external stimulus to take then pins high, and then added code to clear the fault bits, and then programmed the PWM, and it appears the to work.

Thanks for the reply.

I checked P1FLTACON and P1FLTBCON with Watch, before setting RB5 and RB4 high, and then i set these pins high with simulus(after resetting the program to start from the first line) but the value didn't change, it was 0X0080. it seems faults are not triggered (Based on the value of registers).
Am I checking the wrong register?
What should i add to my code to clear the fault bits? ( I think i can clear the bit with bit_clear(); which bit should i clear?)
Can i use set_pullup(TRUE,PIN_B5) in my code to internally pull up these pins for programming?
Ttelmah



Joined: 11 Mar 2010
Posts: 19552

View user's profile Send private message

PostPosted: Tue Feb 03, 2015 3:23 am     Reply with quote

Several things.

You can't just use an async stimulus. It has to be seen as an 'external' stimulus.
Use the 'clock stimulus' tab, and select RB6, 'initial' HIGH 'begin' At start, 'End' never. Do the same on the next line for RB5. Then the pins are seen to be taken high as soon as the processor starts, and held high.

However with the code below, it works even if the fault pins are not taken high.

Then I've gone 'OTT', but it works:
Code:

//start of main:
void main()
{
         
   setup_motor_pwm(1,MPWM_DISABLED,1,1,199); //ensure PWM is off
   set_motor_unit(1,1,MPWM_ENABLE | MPWM_FAULT_NO_CHANGE,4,4);
   set_motor_unit(1,2,MPWM_ENABLE | MPWM_FAULT_NO_CHANGE,4,4);
   set_motor_unit(1,3,MPWM_ENABLE | MPWM_FAULT_NO_CHANGE,4,4);
   //now disable fault behaviour
   #bit FLTAM=getenv("BIT:FLTAM")
   #bit FLTBM=getenv("BIT:FLTBM")
   FLTAM=FALSE;
   FLTBM=FALSE;
   clear_interrupt(INT_FAULTA);
   clear_interrupt(INT_FAULTA); //now clear all the fault flags and interrupts
   setup_motor_pwm(1,MPWM_FREE_RUN,1,1,199); //and start the PWM

   OUTPUT_HIGH(PIN_A0);
   
   enable_interrupts(INT_PWM1);
   enable_interrupts(INTR_GLOBAL); 

   while(TRUE)
   {
         Temp1 = i;
         Temp2 = Temp1 + PHASE_SHIFT_120;
         Temp3 = Temp1 + PHASE_SHIFT_240;
         
         Phase1 = Temp1;
         Phase2 = Temp2;
         Phase3 = Temp3;
         
         set_motor_pwm_duty(1,1,SineTable[Phase1]+199);
         set_motor_pwm_duty(1,2,SineTable[Phase2]+199);
         set_motor_pwm_duty(1,3,SineTable[Phase3]+199);
         while (Temp1==i)
             ; //wait for interrupt         
   }
}


Now this waits for the interrupt to occur before trying to update the PWM registers. Currently you are updating them repeatedly and only the last update will be seen. As soon as 'i' changes, this code advances and updates the new PWM values.

Now, with all the errors cleared, this starts working, merrily updating all three pairs of pins in the simulator at least.
af19



Joined: 21 Aug 2014
Posts: 15

View user's profile Send private message

PostPosted: Tue Feb 03, 2015 2:09 pm     Reply with quote

Ttelmah wrote:
Several things.

You can't just use an async stimulus. It has to be seen as an 'external' stimulus.
Use the 'clock stimulus' tab, and select RB6, 'initial' HIGH 'begin' At start, 'End' never. Do the same on the next line for RB5. Then the pins are seen to be taken high as soon as the processor starts, and held high.

However with the code below, it works even if the fault pins are not taken high.

Then I've gone 'OTT', but it works:
Code:

//start of main:
void main()
{
         
   setup_motor_pwm(1,MPWM_DISABLED,1,1,199); //ensure PWM is off
   set_motor_unit(1,1,MPWM_ENABLE | MPWM_FAULT_NO_CHANGE,4,4);
   set_motor_unit(1,2,MPWM_ENABLE | MPWM_FAULT_NO_CHANGE,4,4);
   set_motor_unit(1,3,MPWM_ENABLE | MPWM_FAULT_NO_CHANGE,4,4);
   //now disable fault behaviour
   #bit FLTAM=getenv("BIT:FLTAM")
   #bit FLTBM=getenv("BIT:FLTBM")
   FLTAM=FALSE;
   FLTBM=FALSE;
   clear_interrupt(INT_FAULTA);
   clear_interrupt(INT_FAULTA); //now clear all the fault flags and interrupts
   setup_motor_pwm(1,MPWM_FREE_RUN,1,1,199); //and start the PWM

   OUTPUT_HIGH(PIN_A0);
   
   enable_interrupts(INT_PWM1);
   enable_interrupts(INTR_GLOBAL); 

   while(TRUE)
   {
         Temp1 = i;
         Temp2 = Temp1 + PHASE_SHIFT_120;
         Temp3 = Temp1 + PHASE_SHIFT_240;
         
         Phase1 = Temp1;
         Phase2 = Temp2;
         Phase3 = Temp3;
         
         set_motor_pwm_duty(1,1,SineTable[Phase1]+199);
         set_motor_pwm_duty(1,2,SineTable[Phase2]+199);
         set_motor_pwm_duty(1,3,SineTable[Phase3]+199);
         while (Temp1==i)
             ; //wait for interrupt         
   }
}


Now this waits for the interrupt to occur before trying to update the PWM registers. Currently you are updating them repeatedly and only the last update will be seen. As soon as 'i' changes, this code advances and updates the new PWM values.

Now, with all the errors cleared, this starts working, merrily updating all three pairs of pins in the simulator at least.

I added
Code:
#FUSES NOPWMLOCK
and then my problem solved.
I will try your code.
I really appreciate your help.
Thank you very much.
Ttelmah



Joined: 11 Mar 2010
Posts: 19552

View user's profile Send private message

PostPosted: Tue Feb 03, 2015 2:16 pm     Reply with quote

Yes, I had that in my code, forgot to include it or point this out....
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Goto page Previous  1, 2
Page 2 of 2

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group