change existing pwm example to reflect both existing ways to use pwm output
This commit is contained in:
		
							parent
							
								
									693bd8c6de
								
							
						
					
					
						commit
						f32b0fbc3b
					
				@ -1,6 +1,8 @@
 | 
			
		||||
//! This example shows how to use PWM (Pulse Width Modulation) in the RP2040 chip.
 | 
			
		||||
//! This example shows how to use PWM (Pulse Width Modulation) in the RP235x chip.
 | 
			
		||||
//!
 | 
			
		||||
//! The LED on the RP Pico W board is connected differently. Add a LED and resistor to another pin.
 | 
			
		||||
//! We demonstrate two ways of using PWM:
 | 
			
		||||
//! 1. Via config
 | 
			
		||||
//! 2. Via setting a duty cycle
 | 
			
		||||
 | 
			
		||||
#![no_std]
 | 
			
		||||
#![no_main]
 | 
			
		||||
@ -8,8 +10,10 @@
 | 
			
		||||
use defmt::*;
 | 
			
		||||
use embassy_executor::Spawner;
 | 
			
		||||
use embassy_rp::block::ImageDef;
 | 
			
		||||
use embassy_rp::pwm::{Config, Pwm};
 | 
			
		||||
use embassy_rp::peripherals::{PIN_25, PIN_4, PWM_SLICE2, PWM_SLICE4};
 | 
			
		||||
use embassy_rp::pwm::{Config, Pwm, SetDutyCycle};
 | 
			
		||||
use embassy_time::Timer;
 | 
			
		||||
// use embedded_hal_1::pwm::SetDutyCycle;
 | 
			
		||||
use {defmt_rtt as _, panic_probe as _};
 | 
			
		||||
 | 
			
		||||
#[link_section = ".start_block"]
 | 
			
		||||
@ -17,13 +21,22 @@ use {defmt_rtt as _, panic_probe as _};
 | 
			
		||||
pub static IMAGE_DEF: ImageDef = ImageDef::secure_exe();
 | 
			
		||||
 | 
			
		||||
#[embassy_executor::main]
 | 
			
		||||
async fn main(_spawner: Spawner) {
 | 
			
		||||
async fn main(spawner: Spawner) {
 | 
			
		||||
    let p = embassy_rp::init(Default::default());
 | 
			
		||||
    spawner.spawn(pwm_set_config(p.PWM_SLICE4, p.PIN_25)).unwrap();
 | 
			
		||||
    spawner.spawn(pwm_set_dutycycle(p.PWM_SLICE2, p.PIN_4)).unwrap();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
    let mut c: Config = Default::default();
 | 
			
		||||
    c.top = 0x8000;
 | 
			
		||||
/// Demonstrate PWM by modifying & applying the config
 | 
			
		||||
///
 | 
			
		||||
/// Using the onboard led, if You are using a different Board than plain Pico2 (i.e. W variant)
 | 
			
		||||
/// you must use another slice & pin and an appropriate resistor.
 | 
			
		||||
#[embassy_executor::task]
 | 
			
		||||
async fn pwm_set_config(slice4: PWM_SLICE4, pin25: PIN_25) {
 | 
			
		||||
    let mut c = Config::default();
 | 
			
		||||
    c.top = 32_768;
 | 
			
		||||
    c.compare_b = 8;
 | 
			
		||||
    let mut pwm = Pwm::new_output_b(p.PWM_SLICE4, p.PIN_25, c.clone());
 | 
			
		||||
    let mut pwm = Pwm::new_output_b(slice4, pin25, c.clone());
 | 
			
		||||
 | 
			
		||||
    loop {
 | 
			
		||||
        info!("current LED duty cycle: {}/32768", c.compare_b);
 | 
			
		||||
@ -32,3 +45,31 @@ async fn main(_spawner: Spawner) {
 | 
			
		||||
        pwm.set_config(&c);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Demonstrate PWM by setting duty cycle
 | 
			
		||||
///
 | 
			
		||||
/// Using GP4 in Slice2, make sure to use an appropriate resistor.
 | 
			
		||||
#[embassy_executor::task]
 | 
			
		||||
async fn pwm_set_dutycycle(slice2: PWM_SLICE2, pin4: PIN_4) {
 | 
			
		||||
    let mut c = Config::default();
 | 
			
		||||
    c.top = 32_768;
 | 
			
		||||
    let mut pwm = Pwm::new_output_a(slice2, pin4, c.clone());
 | 
			
		||||
 | 
			
		||||
    loop {
 | 
			
		||||
        // 100% duty cycle, fully on
 | 
			
		||||
        pwm.set_duty_cycle_fully_on().unwrap();
 | 
			
		||||
        Timer::after_secs(1).await;
 | 
			
		||||
 | 
			
		||||
        // 50% duty cycle, half on. Expressed as simple percentage.
 | 
			
		||||
        pwm.set_duty_cycle_percent(50).unwrap();
 | 
			
		||||
        Timer::after_secs(1).await;
 | 
			
		||||
 | 
			
		||||
        // 25% duty cycle, quarter on. Expressed as (duty / max_duty)
 | 
			
		||||
        pwm.set_duty_cycle(8_192 / c.top).unwrap();
 | 
			
		||||
        Timer::after_secs(1).await;
 | 
			
		||||
 | 
			
		||||
        // 0% duty cycle, fully off.
 | 
			
		||||
        pwm.set_duty_cycle_fully_off().unwrap();
 | 
			
		||||
        Timer::after_secs(1).await;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user