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 support@ccsinfo.com

High Speed PWM, how to configure it?

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
Donatello



Joined: 21 Oct 2016
Posts: 22

View user's profile Send private message

High Speed PWM, how to configure it?
PostPosted: Fri Oct 21, 2016 10:19 am     Reply with quote

Dear programmers,
For many days, I try to use High Speed PWM functions, but no PWM is generated. I use these instructions:
Code:

setup_hspwm_unit(1, HSPWM_ENABLE | HSPWM_FAULT_MODE_DISABLED | HSPWM_H_POLAIRTY_HIGH | HSPWM_L_POLARITY_LOW | HSPWM_COMPLEMENTARY | HSPWM_TIME_BASE_FROM_PHASE_REGS);
set_hspwm_phase(1,500);
set_hspwm_duty(1,224);

Please, can someone help me?
Thank you

Best Regards,
Donatello
Ttelmah



Joined: 11 Mar 2010
Posts: 19329

View user's profile Send private message

PostPosted: Fri Oct 21, 2016 10:42 am     Reply with quote

Does nobody try looking at the examples.... Crying or Very sad

ex_hspwm.c

You are setting up the 'unit', but not actually setting up the clock or enabling the pwm

setup_hspwm
Donatello



Joined: 21 Oct 2016
Posts: 22

View user's profile Send private message

PostPosted: Sat Oct 22, 2016 5:07 am     Reply with quote

Hello Ttelmah,
Thank you for reply.
I tried looking in the examples (v5.061) but I could not find any HSPWM examples. Sad

My dspic is 33EP512GM604, and I use these lines:
Code:

setup_hspwm (HSPWM_ENABLED | HSPWM_CLOCK_DIV_BY_1, 1000);
setup_hspwm_unit (1 HSPWM_ENABLE | HSPWM_FAULT_MODE_DISABLED | HSPWM_H_POLAIRTY_HIGH | HSPWM_L_POLARITY_LOW | HSPWM_COMPLEMENTARY | HSPWM_TIME_BASE_FROM_PHASE_REGS);
set_hspwm_phase (1,130);
set_hspwm_duty (1,224);

but without any PWM signal. Crying or Very sad
I also also included these lines:
Code:

while(1)
    {
        output_high(pin_led1);
        delay_ms(1000);
        output_low(pin_led1);
        delay_ms(1000);
    }

and the LED blinks as expected then the clock is corrected and set to 140MHz.


Last edited by Donatello on Sun Oct 23, 2016 2:49 am; edited 1 time in total
temtronic



Joined: 01 Jul 2010
Posts: 9162
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Sat Oct 22, 2016 7:16 am     Reply with quote

while I don't use that PIC...

is this line...

setup_hspwm_unit (1 HSPWM_ENABLE | HSPWM_FAULT_MODE_DISABLED | HSPWM_H_POLAIRTY_HIGH | HSPWM_L_POLARITY_LOW | HSPWM_COMPLEMENTARY | HSPWM_TIME_BASE_FROM_PHASE_REGS);

correct as far as syntax( proper 'format') goes ??

I ask as the first program has a comma between 1 and the next option.


Jay
dyeatman



Joined: 06 Sep 2003
Posts: 1923
Location: Norman, OK

View user's profile Send private message

PostPosted: Sat Oct 22, 2016 10:00 am     Reply with quote

The ex_hspwm.c referenced by TTelmah was apparently added
in 5.064 because I didn't have it either until I upgraded.
The example uses the 33EP512MC502.
_________________
Google and Forum Search are some of your best tools!!!!
Ttelmah



Joined: 11 Mar 2010
Posts: 19329

View user's profile Send private message

PostPosted: Sun Oct 23, 2016 1:21 am     Reply with quote

Hadn't realised that example was quite so recent....

I'd simply ask CCS for it. They will normally give an example like this, and then you have a 'starting point' to work from.

As further comments/questions, what chip?. What compiler version?. What frequency do you want to generate, on what pins?. etc. etc..
Donatello



Joined: 21 Oct 2016
Posts: 22

View user's profile Send private message

PostPosted: Sun Oct 23, 2016 2:48 am     Reply with quote

I use dspic33EP512GM604@140MHz (8MHz crystal) with PCWHD v5.061, my goal is to generate a 1MHz complementary signals on PWM1H (pin14) and PWM1L (pin15).

I used an LED (pin10) that flashes to check if the PIC is working properly. I can check the PWM signal with an oscilloscope. The watchdog is disabled.

If I use these line:
setup_hspwm(HSPWM_ENABLED | HSPWM_CLOCK_DIV_BY_4, 0x1000);
00596: MOV #2,W4
00598: MOV W4,C02
0059A: MOV C00,W0
0059C: MOV #580F,W1
0059E: AND W0,W1,W0
005A0: MOV #8000,W1
005A2: IOR W0, W1,W0
005A4: MOV W0,C00
005A6: MOV #1000,W4
005A8: MOV W4,C04

the dsPIC freezes and the LED remains off. I tried changing the settings (prescaler or period value) but without success.

If I use these line:
setup_hspwm(HSPWM_DISABLED | HSPWM_CLOCK_DIV_BY_4, 0x1000);
00596: MOV #2,W4
00598: MOV W4,C02
0059A: MOV C00,W0
0059C: MOV #580F,W1
0059E: AND W0,W1,W0
005A0: MOV #0,W1
005A2: IOR W0, W1,W0
005A4: MOV W0,C00
005A6: MOV #1000,W4
005A8: MOV W4,C04

The LED is blinking but the HSPWM module is disabled.
Ttelmah



Joined: 11 Mar 2010
Posts: 19329

View user's profile Send private message

PostPosted: Sun Oct 23, 2016 3:06 am     Reply with quote

The reason for this, is the setup for the module must be after the setup for the unit.

Problem is that the chips always wake with the fault enabled. This is done so that the PWM won't start till it is configured. The fault has to be cleared first, and the setup_hspwm_unit code does this.
So what is happening is when you enable the PWM module it immediately errors.

I think given that the example really ought to be there on the earlier compiler, I'll post the three setup lines from this:
Code:

   setup_hspwm_unit(1, HSPWM_ENABLE | HSPWM_REDUNDANT | HSPWM_TIME_BASE_FROM_PHASE_REGS | //Enable PWM1L and PWM1H with same signal and faults disabled.
                       HSPWM_FAULT_MODE_DISABLED);                                        //Frequency set with phase register, independent from Master Period register (PTPER).
                                                                                          //Duty cycle set with duty cycle register, independent from Master Duty Cycle register (MDC).
   setup_hspwm(HSPWM_ENABLED | HSPWM_CLOCK_DIV_BY_2, 0xFFFF);  //HSPWM enabled, PWM Clock = Fosc/2

   set_hspwm_phase(1, PwmPeriod - 1);  //Set the frequency of the PWM signal.


PwmPeriod, is 3200, for 5KHz in the example (running at 32Mhz).
Donatello



Joined: 21 Oct 2016
Posts: 22

View user's profile Send private message

PostPosted: Wed Oct 26, 2016 4:20 am     Reply with quote

Thanks for the advices everyone. I solved by inserting these lines:

Code:
#fuses NOPWMLOCK


Code:
 setup_hspwm_unit(1, HSPWM_ENABLE | HSPWM_REDUNDANT | HSPWM_TIME_BASE_FROM_PHASE_REGS | HSPWM_FAULT_MODE_DISABLED|HSPWM_CENTER_ALIGN_MODE);
    setup_hspwm_unit(2,HSPWM_DISABLED);
    setup_hspwm_unit(3,HSPWM_DISABLED);
    setup_hspwm_unit(4,HSPWM_DISABLED);
    setup_hspwm_unit(5,HSPWM_DISABLED);
    setup_hspwm_unit(6,HSPWM_DISABLED);
    set_hspwm_phase(1, 22); //Set the frequency of the PWM signal.
    set_hspwm_duty(1,10);
    setup_hspwm(HSPWM_ENABLED | HSPWM_CLOCK_DIV_BY_1 , 0x0000);


The instructions order is important. Disable unused units, otherwise it can not be used for I/O ports.
shirke



Joined: 08 Nov 2016
Posts: 11
Location: Hungary

View user's profile Send private message

HSPWM
PostPosted: Sun Dec 04, 2016 3:02 pm     Reply with quote

Hi,
Sorry, I don't understand it. How can I set the PWM frequency and duty cycle? Can you show me an example?

Best Regards,
Shirke
_________________
shirke
temtronic



Joined: 01 Jul 2010
Posts: 9162
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Sun Dec 04, 2016 3:35 pm     Reply with quote

shirke

1) read the datasheet for the PIC, especially the 'PWM' section

2) read the compiler manual, again lookup PWM...

3) look at the example that CCS supplies....

4) look at the PIC 'header' to see what options are used...

5) cut minimal code and see what happens


Jay
Ttelmah



Joined: 11 Mar 2010
Posts: 19329

View user's profile Send private message

PostPosted: Mon Dec 05, 2016 2:32 am     Reply with quote

3) here is particularly important. If you read the example that I refer to earlier, it has notes in the 'comments' explaining how the figures are calculated.
shirke



Joined: 08 Nov 2016
Posts: 11
Location: Hungary

View user's profile Send private message

PostPosted: Mon Dec 05, 2016 6:27 am     Reply with quote

Ttelmah wrote:
3) here is particularly important. If you read the example that I refer to earlier, it has notes in the 'comments' explaining how the figures are calculated.


Ok. And where can I find that example? In the example folder?
_________________
shirke
temtronic



Joined: 01 Jul 2010
Posts: 9162
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Mon Dec 05, 2016 7:51 am     Reply with quote

Yes, the examples are in the examples folder...

The program names may not be real informative, but generally do say what's inside....

ie ex_sisr.c is the ex(ample) of the s(erial) i(nterrupt) s(ervice) r(outine).

Also while some are to demonstrate 'something', they usually contain information about 'other' features of the PICs and compiler.

It is very good time spent opening and looking at ALL of the examples !

and...

if you press F11 while your project is open, the CCS manual 'magically' appears.

Jay
Ttelmah



Joined: 11 Mar 2010
Posts: 19329

View user's profile Send private message

PostPosted: Mon Dec 05, 2016 8:02 am     Reply with quote

and as a general comment, even people who have used the PIC's for years will sometimes find themselves referring back to the samples, and (of course), a simple 'search', using 'HSPWM' as the search parameter, will quickly find the ones that apply to this.

There are some 'old favourites', where the examples can mislead (unfortunately, CCS omit 'ERRORS' on quite a few of the RS232 setups, use 'ADC_CLOCK_INTERNAL', where really they shouldn't, etc...), but 90% show the basics of how to use just about every feature.
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
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