From 527b219de50f6a36ce7f37d18cdd81dc7f23adf2 Mon Sep 17 00:00:00 2001 From: ImplFerris Date: Wed, 23 Oct 2024 23:36:32 +0530 Subject: [PATCH] pwm --- src/blinky/pwm.md | 74 +++++++++++++++++++--------------- src/images/pwm-duty-cycle.png | Bin 0 -> 19025 bytes 2 files changed, 41 insertions(+), 33 deletions(-) create mode 100644 src/images/pwm-duty-cycle.png diff --git a/src/blinky/pwm.md b/src/blinky/pwm.md index 131a8ae..5969e5c 100644 --- a/src/blinky/pwm.md +++ b/src/blinky/pwm.md @@ -4,46 +4,17 @@ PWM stands for **Pulse Width Modulation**. It is a technique used to control the In PWM, a digital signal switches between **on** and **off** states. The **duty cycle** of the signal determines how long it stays on compared to how long it stays off. -- **Duty Cycle**: The percentage of time the signal is on during one cycle. +- **Duty Cycle**: +The percentage of time the signal is on during one cycle. +pico2 +Image Credit: Wikipedia - For example: - 100% duty cycle means the signal is always on. - 50% duty cycle means the signal is on half the time and off half the time. - 0% duty cycle means the signal is always off. -For LED brightness, PWM works by rapidly turning the LED on and off. If this happens fast enough, our eyes perceive a steady light, and the brightness increases with a higher duty cycle. - Refer the 1073th page of the [RP2350](https://datasheets.raspberrypi.com/rp2350/rp2350-datasheet.pdf) Datasheet for more information. -In the previous example code, we use PWM to fade an LED. - -### Fading Up -The code below gradually increases the LED brightness by adjusting the duty cycle from 0 to 25,000, with a small delay between each step: -```rust -for i in LOW..=HIGH { - delay.delay_us(8); - let _ = channel.set_duty_cycle(i); -} -``` -The delay ensures the LED brightens gradually. Without it, the brightness would change too quickly for the eye to notice, making the LED appear to jump from dim to bright. The delay allows for a smooth, noticeable "fading up" effect. Dont' believe me! Adjust the delay to 0 and observe. You can increase the delay (eg: 25) and observe the fading effect. - -Note: `set_duty_cycle` function under the hood writes the given value into CC register(Count compare value). - -### Fading Down -The following code decreases the LED brightness by reducing the duty cycle from 25,000 to 0. -```rust -// Here rev is to reverse the iteration. so it goes from 25_000 to 0 -for i in (LOW..=HIGH).rev() { - delay.delay_us(8); - let _ = channel.set_duty_cycle(i); -} -``` - -### Pause -After fading up and down, the program pauses for 500 milliseconds before repeating the cycle, allowing the LED to rest briefly. - -Play around by adjusting the `delay` and observe. You can even comment out one of the for loop and observe the effect. - - ## PWM Peripheral in RP2350 The PWM peripheral is responsible for generating PWM signals. The Pico 2 features 12 PWM generators, known as slices, with each slice having two channels(A/B). This configuration results in a total of 24 PWM output channels available for use. @@ -73,3 +44,40 @@ Get a mutable reference to channel B of PWM4 and direct its output to GPIO pin 2 let channel = &mut pwm.channel_b; channel.output_to(pins.gpio25); ``` + +## Fading Effect + +For LED brightness, PWM works by rapidly turning the LED on and off. If this happens fast enough, our eyes perceive a steady light, and the brightness increases with a higher duty cycle. + + +In the previous example code, we use PWM to fade an LED. + +### Fading Up +The code below gradually increases the LED brightness by adjusting the duty cycle from 0 to 25,000, with a small delay between each step: +```rust +for i in LOW..=HIGH { + delay.delay_us(8); + let _ = channel.set_duty_cycle(i); +} +``` +The delay ensures the LED brightens gradually. Without it, the brightness would change too quickly for the eye to notice, making the LED appear to jump from dim to bright. The delay allows for a smooth, noticeable "fading up" effect. + +Dont' believe me! Adjust the delay to 0 and observe. You can increase the delay (eg: 25) and observe the fading effect. + +Note: `set_duty_cycle` function under the hood writes the given value into CC register(Count compare value). + +### Fading Down +The following code decreases the LED brightness by reducing the duty cycle from 25,000 to 0. +```rust +// Here rev is to reverse the iteration. so it goes from 25_000 to 0 +for i in (LOW..=HIGH).rev() { + delay.delay_us(8); + let _ = channel.set_duty_cycle(i); +} +``` + +### Pause +After fading up and down, the program pauses for 500 milliseconds before repeating the cycle, allowing the LED to rest briefly. + +Play around by adjusting the `delay` and observe. You can even comment out one of the for loop and observe the effect. + diff --git a/src/images/pwm-duty-cycle.png b/src/images/pwm-duty-cycle.png new file mode 100644 index 0000000000000000000000000000000000000000..89f77f71cfbdfecb8406186e1bc39a9a0399e292 GIT binary patch literal 19025 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

-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 J%Q~loCIFx_lhgnJ literal 0 HcmV?d00001