ppyonc

Arduino DUE SPWM Generator

Dec 9th, 2025 (edited)
38
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Arduino 2.24 KB | Source Code | 0 0
  1. volatile bool ms_flag = false;
  2. int elapsedTime = 0;
  3. bool positive = true;
  4. float voltageFactor = 1;
  5.  
  6. #define REG_TC0_SR0 (*(volatile uint32_t*)0x40080020)
  7.  
  8. void TC0_Handler() {
  9.     REG_TC0_SR0;
  10.     ms_flag = true;
  11. }
  12.  
  13. void setup() {
  14.     Serial.begin(115200);
  15.  
  16.   REG_PMC_PCER1 |= PMC_PCER1_PID36;     // Enable PWM peripheral (PID36)
  17.  
  18.   REG_PIOC_ABSR |= PIO_ABSR_P23 | PIO_ABSR_P24;     // Set pins to Peripheral B
  19.   REG_PIOC_PDR |= PIO_PDR_P23 | PIO_PDR_P24;        // Disable PIO control
  20.  
  21.   REG_PWM_CLK = PWM_CLK_PREA(0) | PWM_CLK_DIVA(1);  //Set global PWM clock rate to 84MHz (84MHz/1)
  22.  
  23.   REG_PWM_CMR6 = PWM_CMR_CPRE_CLKA;     // Enable single slope PWM, clock source CLKA
  24.   REG_PWM_CPRD6 = 4200;     // Set period (20kHz frequency)
  25.   REG_PWM_CDTY6 = 0;        // Set duty cycle (0%)
  26.  
  27.   REG_PWM_CMR7 = PWM_CMR_CPRE_CLKA;     // Enable single slope PWM, clock source CLKA
  28.   REG_PWM_CPRD7 = 4200;     // Set period (20kHz frequency)
  29.   REG_PWM_CDTY7 = 0;        // Set duty cycle (0%)
  30.  
  31.   REG_PWM_ENA = PWM_ENA_CHID6 | PWM_ENA_CHID7;  // Enable the PWM channels
  32.  
  33.   REG_PWM_SCUP = 1U;
  34.  
  35.   REG_PWM_SCUC = (1U << 6) | (1U << 7);
  36.  
  37.   REG_PMC_PCER0 |= PMC_PCER0_PID27;
  38.  
  39.   REG_TC0_CMR0 = 0x02 | TC_CMR_CPCTRG;
  40.  
  41.   REG_TC0_RC0 = 2625;
  42.  
  43.   REG_TC0_IER0 = TC_IER_CPCS;   // Enable the RC Compare Interrupt (CPCS) in the Timer Counter
  44.  
  45.   NVIC_EnableIRQ(TC0_IRQn);
  46.  
  47.   REG_TC0_CCR0 = TC_CCR_CLKEN | TC_CCR_SWTRG;   // Enable and start the Timer Channel
  48.  
  49.   delay(5000);  // Delay before starting
  50. }
  51.  
  52. void loop() {
  53.     if (ms_flag) {
  54.         noInterrupts();
  55.         elapsedTime = elapsedTime + 1;
  56.         ms_flag = false;
  57.         interrupts();
  58.  
  59.         if (elapsedTime > 50) {
  60.             positive = !positive;
  61.             elapsedTime = 1;
  62.         }
  63.  
  64.         Serial.print("ms: ");
  65.         Serial.print(elapsedTime);
  66.         Serial.print(", Direction: ");
  67.         Serial.println(positive ? "UP" : "DOWN");
  68.  
  69.         float dutyFactor = sin( (2.0 * PI / 100.0) * elapsedTime );
  70.        
  71.         if (positive) {
  72.             REG_PWM_CDTY6 = dutyFactor * 4200 * voltageFactor;
  73.             REG_PWM_CDTY7 = 0;
  74.         } else {
  75.             REG_PWM_CDTY6 = 0;
  76.             REG_PWM_CDTY7 = dutyFactor * 4200 * voltageFactor;
  77.         }
  78.     }
  79. }
Advertisement
Add Comment
Please, Sign In to add comment