PWM with regular digital IO and with digital pin that supports PWM generation
Dependencies: mbed
Diff: main.cpp
- Revision:
- 1:56cc90ae5080
- Parent:
- 0:ee9aab897b59
diff -r ee9aab897b59 -r 56cc90ae5080 main.cpp --- a/main.cpp Mon Apr 20 15:07:18 2015 +0000 +++ b/main.cpp Tue May 12 09:46:06 2015 +0000 @@ -3,7 +3,8 @@ * @author Petr Douša * @version V1.0 * @date 20-April-2015 -* @brief This program use digital output and regular PWM output to modulate PWM +* @brief This program uses digital output (software) and hardware PWM output +* to generate two separate PWMs ***********************************************************************************/ /**********************************************************************************/ @@ -57,7 +58,7 @@ int off_delay = 0; //mbed - initialization of peripherals -Timeout timer; // timer use with digital IO +Timeout timer; // timer used with digital IO DigitalOut my_pwm(LED1); // digital IO used by pwm_io function PwmOut real_pwm(PA_8); // regular PWM output @@ -65,7 +66,7 @@ /******************************************************************************* * Function Name : toggleOn. -* Description : Set high on digital pin and set and start timer. +* Description : Set high level on digital pin and timer startup. * Input : None. * Output : None. * Return : None. @@ -78,7 +79,7 @@ /******************************************************************************* * Function Name : toggleOff. -* Description : Set low on digital pin and set and start timer. +* Description : Set low level on digital pin and set and start timer. * Input : None. * Output : None. * Return : None. @@ -91,23 +92,23 @@ /******************************************************************************* * Function Name : pwm_io. -* Description : Set variables and start PWM on digital output. -* Input : p_us: signal period in micro_seconds ,dc: signal duty-cycle (0.0 to 1.0) . -* Output : on_delay: time to be digital output on high ,off_delay: time to be digital output on low: . +* Description : Set variables and start software PWM on digital output. +* Input : p_us: signal period in micro_seconds, dc: signal duty-cycle (0.0 to 1.0) . +* Output : on_delay: output ON time, off_delay: output OFF time * Return : None. *******************************************************************************/ void pwm_io(int p_us, float dc) { timer.detach(); // shutdown timer if ((p_us == 0) || (dc == 0)) { // if duty-cycle is 0 - my_pwm = 0; // set low regular IO to low + my_pwm = 0; // set high IO to low return; } if (dc >= 1) { // if duty-cycle is 1 and more - my_pwm = 1; // set high regular IO to low + my_pwm = 1; // set high IO to low return; } - on_delay = (int)(p_us * dc); // calculate time to be digital output on high and low + on_delay = (int)(p_us * dc); // calculate the time off_delay = p_us - on_delay; toggleOn(); // call function toggleOn to start PWM } @@ -123,24 +124,24 @@ { double a=0; // variable to set duty-cycle - real_pwm.period_us(2000); // set period of real PWM to 2 milliseconds - real_pwm.write(a); // set duty-cycle as it is in variable a (0 at this point) + real_pwm.period_us(2000); // set period of hardware PWM to 2 milliseconds + real_pwm.write(a); // set duty-cycle from a (0 at this point) - pwm_io(2000, a); // set period of digital IO PWM to 2 ms and duty-cycle as in variable a (0 at this point) + pwm_io(2000, a); // set period of software PWM to 2 ms and duty-cycle as in variable a (0 at this point) - while(1) { // main cykl of program + while(1) { // main cycle of the program - if(a>=1) { // if variable is grater then 1 set it 0 else attributable 0.01 + if(a>=1) { // if variable is grater then 1 set it 0 else increment 0.01 a=0; } else { a=a+0.01; } - real_pwm.write(a); // set duty-cycle of real PWM as as it is in variable a + real_pwm.write(a); // set duty-cycle of hardware PWM as as it is in variable a - pwm_io(2000, a); // set duty-cycle of digital IO PWM as as it is in variable a and period to 2 ms + pwm_io(2000, a); // set duty-cycle of software PWM as as it is in variable a and period to 2 ms wait(0.05); // wait some time in milliseconds }