Three phase sinusoidal PWM example for the STM32L432 Nucleo

Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
f3d
Date:
Mon Dec 02 12:13:04 2019 +0000
Parent:
0:88449c646fbd
Commit message:
Added speed-up/slow-down code

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
diff -r 88449c646fbd -r 581901598cda main.cpp
--- a/main.cpp	Tue Mar 26 17:33:53 2019 +0000
+++ b/main.cpp	Mon Dec 02 12:13:04 2019 +0000
@@ -8,21 +8,27 @@
 
 // Using the MBED libraries to configure the PWM outputs (its easier than 
 // calculating all of the register contents by hand)
-DigitalOut myled(LED1);
 PwmOut  PhaATop(PA_8); 
 PwmOut  PhaBTop(PA_9); 
 PwmOut  PhaCTop(PA_10); 
 PwmOut  PhaABottom(PA_7); 
 PwmOut  PhaBBottom(PB_0); 
 PwmOut  PhaCBottom(PB_1); 
+DigitalIn Slow(D4);
+DigitalIn Fast(D5);
+DigitalOut myled(LED1);
+#define MAX_DELTA 500
+volatile int Delta=0;
 int AIndex=0;
 int BIndex=90;
 int CIndex=180;
 void TimerISR(void)
 {   
-    TIM1->CCR1 = sine_table[AIndex];
-    TIM1->CCR2 = sine_table[BIndex];
-    TIM1->CCR3 = sine_table[CIndex];
+    TIM1->ARR = 270+Delta;
+    int Offset=Delta/2;
+    TIM1->CCR1 = sine_table[AIndex]+Offset;
+    TIM1->CCR2 = sine_table[BIndex]+Offset;
+    TIM1->CCR3 = sine_table[CIndex]+Offset;
     AIndex++;
     if (AIndex >= PWM_STEPS)
         AIndex = 0;
@@ -46,8 +52,9 @@
     TIM1->CCR1 = 135; // 50% duty
     TIM1->CCR2 = 135; // 50% duty
     TIM1->CCR3 = 135; // 50% duty
-    // Enable complimentary outputs on channels 1 to 3
-    TIM1->CCER = (1 << 0) + (1 << 2) + (1 << 4) + (1 << 6) + (1 << 8) + (1<<10);
+    //// Enable complimentary outputs on channels 1 to 3
+    //TIM1->CCER = (1 << 0) + (1 << 2) + (1 << 4) + (1 << 6) + (1 << 8) + (1<<10);
+    TIM1->CCER = (1 << 0) +  (1 << 4) + (1 << 8);
     TIM1->SR = 0;      // Clear flags.    
     //TIM1->BDTR &= ~(0xff);
     //TIM1->BDTR |= (127); // set dead time to 127 clock cycles
@@ -55,7 +62,7 @@
     TIM1->DIER = 1; // Want update interrupt
     NVIC_SetVector(TIM1_UP_TIM16_IRQn,(uint32_t) TimerISR);   
     NVIC_EnableIRQ(TIM1_UP_TIM16_IRQn);
-    __enable_irq();   // enable interrupts */
+    __enable_irq();   // enable interrupts 
     TIM1->CR1 |= 1; // enable counter
 
 }
@@ -63,6 +70,33 @@
 int main() {    
     initTimer1();
     while(1) {
-       
+
+        if ( (Slow == 0) || (Fast == 0) )
+        {
+            // user pressed a button so light up an LED
+            myled = 1;
+            if (Slow == 0)
+            {
+                int NextDelta = Delta;
+                NextDelta = NextDelta + 10;
+                if (NextDelta > MAX_DELTA)
+                    NextDelta = MAX_DELTA;
+                Delta = NextDelta;
+            }
+            if (Fast == 0)
+            {
+                int NextDelta = Delta;
+                NextDelta = NextDelta - 10;
+                if (NextDelta < 0)
+                    NextDelta = 0;
+                Delta = NextDelta;
+            }
+            
+        }
+        else
+        {
+            myled = 0;
+        }
+        wait(0.1); // slow down loop to avoid bounces
     }
 }