Mike Etek Controller

Dependencies:   mbed

Revision:
1:94193b31f0ee
Parent:
0:9edd6ec0f56a
--- a/Inverter/Inverter.cpp	Sat May 20 21:42:20 2017 +0000
+++ b/Inverter/Inverter.cpp	Sat Apr 06 02:16:12 2019 +0000
@@ -1,96 +1,111 @@
+#include "Inverter.h"
 
-#include "mbed.h"
-#include "hw_pins.h"
-//#include "hw_config.h"
-#include "structs.h"
-#include "FastPWM.h"
+
+
+//Condensing all hardware related variables into just this file.
+//This includes all the register diddling, assigning duty cycles, etc. 
+//should probably have a class called "inverter" but thats a lot of effort
+
+Inverter::Inverter(){
 
-void Init_PWM(GPIOStruct *gpio){
     
-    printf("\nStarting Hardware Function\n\r");
+    }
+
+void Inverter::Init_PWM(void){
     
-    RCC->AHB1ENR |= RCC_AHB1ENR_GPIOCEN;                        // enable the clock to GPIOC
-    RCC->APB1ENR |= 0x00000001;                                 // enable TIM2 clock
-    RCC->APB2ENR |= RCC_APB2ENR_TIM1EN;                         // enable TIM1 clock
+    printf("\nStarting Hardware PWM\n\r");
     
-    GPIOC->MODER |= (1 << 10);                                  // set pin 5 to be general purpose output for LED
+    RCC->AHBENR |= RCC_AHBENR_GPIOAEN;                 // enable the clock to GPIOA
+    RCC->APB2ENR |= RCC_APB2ENR_TIM1EN;                // enable TIM1 clock
 
-    //gpio->enable = new DigitalOut(ENABLE_PIN);
-    gpio->pwm_ul = new FastPWM(PIN_AL);
-    gpio->pwm_vl = new FastPWM(PIN_BL);
-    gpio->pwm_wl = new FastPWM(PIN_CL);
-    gpio->pwm_uh = new FastPWM(PIN_AH);
-    gpio->pwm_vh = new FastPWM(PIN_BH);
-    gpio->pwm_wh = new FastPWM(PIN_CH);
-
-    gpio->phasing = 1;
     
-    
-     //ISR Setup     
-    
-    NVIC_EnableIRQ(TIM1_UP_TIM10_IRQn);                         //Enable TIM1 IRQ
+    //PWM Setup
+    TIM1->CCMR1 |= 0x0070;                             // Enable output compare 1 PWM mode 2 (inverted for low side shunts)
+    TIM1->CCER |= TIM_CCER_CC1E;                        // enable outputs 1
+    //no dead time needed!
+    TIM1->BDTR |= TIM_BDTR_MOE;                         //main output enable = 1
+    TIM1->PSC = 0x0;                                   // no prescaler
+    TIM1->ARR = PWM_ARR;                               // set auto reload, 20 khz
+    TIM1->CR1 |= TIM_CR1_ARPE;                         // autoreload on, 
+    RCC->CFGR3 |= RCC_CFGR3_TIM1SW;                    // bump tim1 up to 144MHz
     
-    TIM1->DIER |= TIM_DIER_UIE;                                 // enable update interrupt
-    TIM1->CR1 = 0x40;                                          // CMS = 10, interrupt only when counting up
-    TIM1->CR1 |= TIM_CR1_UDIS;  
-    TIM1->CR1 |= TIM_CR1_ARPE;                                  // autoreload on, 
-    TIM1->RCR |= 0x001;                                         // update event once per up/down count of tim1 
+    //hardware pin setup
+    GPIOA->MODER   |= GPIO_MODER_MODER8_1 ;
+    GPIOA->AFR[1]    |= 0x00000006;                    // PA8 to alternate function 6
+    
+    //interrupt generation
+    NVIC_EnableIRQ(TIM1_UP_TIM16_IRQn);   //Enable TIM1 IRQ                     //dafuq is this TIM16 BS?
+    TIM1->DIER |= TIM_DIER_UIE;           // enable update interrupt
+    TIM1->CR1 |= 0x40;                    //CMS = 10, interrupt only when counting up
+    TIM1->RCR |= 0x001;                   // update event once per up/down count of tim1 
     TIM1->EGR |= TIM_EGR_UG;
     
-    
-        //PWM Setup
-    TIM1->DIER |= TIM_DIER_UIE; // enable update interrupt
-    TIM1->CR1 = 0x40;//CMS = 10, interrupt only when counting up
-    
-    TIM1->CR1 |= TIM_CR1_ARPE; // autoreload on, 
-    TIM1->RCR |= 0x001; // update event once per up/down count of tim1 
-    TIM1->EGR |= TIM_EGR_UG;
- 
-    
-    //PWM Setup
-    TIM1->PSC = 0x0; // no prescaler, timer counts up in sync with the peripheral clock
-    TIM1->ARR = 0x1194; // 20 Khz
-    //TIM1->BDTR |= TIM_BDTR_MOE;
-    //TIM1->BDTR |= TIM_BDTR_OSSI;
-    //TIM1->BDTR |= TIM_BDTR_OSSR;
-    TIM1->BDTR |= 0xBF;
-    TIM1->CCER |= TIM_CCER_CC1E | TIM_CCER_CC1NE | TIM_CCER_CC2E | TIM_CCER_CC2NE | TIM_CCER_CC3E | TIM_CCER_CC3NE;
-    //TIM1->CCER |= ~TIM_CCER_CC1NP; //Interupt when low side is on.
-    //TIM1->CCER |= TIM_CCER_CC1NP;
-    TIM1->CR1 |= TIM_CR1_CEN;   
-    
+    TIM1->CR1 |= TIM_CR1_CEN;   //go!
 
     }
 
-void Init_ADC(void){
+void Inverter::Init_ADC(void){
         // ADC Setup
-     RCC->APB2ENR |= RCC_APB2ENR_ADC2EN;                        // clock for ADC2
-     RCC->APB2ENR |= RCC_APB2ENR_ADC1EN;                        // clock for ADC1
-    RCC->AHB1ENR |= RCC_AHB1ENR_GPIOCEN;                        // Enable clock for GPIOC
-     
-     ADC->CCR = 0x00000006;                                     // Regular simultaneous mode only
-     ADC1->CR2 |= ADC_CR2_ADON;//0x00000001;                    // ADC1 ON
-     ADC1->SQR3 = 0x000000A;                                    // use PC_0 as input  this is the V phase
-     ADC2->CR2 |= ADC_CR2_ADON;//0x00000001;                    // ADC1 ON
-     ADC2->SQR3 = 0x0000000B;                                   // use PC_1 as input. This is the U phase
-     GPIOC->MODER |= 0x0000000f;                                // Alternate function, PC_0, PC_1 are analog inputs 
+    RCC->AHBENR |= RCC_AHBENR_GPIOAEN; 
+    RCC->AHBENR |= RCC_AHBENR_GPIOBEN;
+    RCC->AHBENR |= RCC_AHBENR_ADC12EN;                        // clock for ADC1 and 2 enable 
+    //RCC->AHBENR |= RCC_AHBENR_GPIOAEN;     //page 149 on the ref manual
+    
+    ADC12_COMMON->CCR |= 0x20001;                 // Regular simultaneous mode plus injected conversions
+    
+
+    //for board 3
+    ADC1->SQR1 = 0x40;                            // use PA_0 as input, ADC1 in1
+    ADC2->SQR1 = 0x40;                            // use PA_4 as input, ADC2 in1
+    GPIOA->MODER |= 0x00000303;                   // Alternate function, PA_0, PA_4 are analog inputs 
 
-    }
+    ADC1->SMPR1 = 32;     //19.5 adc cock cycles for sample
+    ADC2->SMPR1 = 32;     //19.5 adc cock cycles for sample. 
+    
+    ADC2->CR |= ADC_CR_ADEN;
+    ADC1->CR |= ADC_CR_ADEN;
+    
+    wait_ms(10);
 
-void Init_DAC(void){
-     RCC->APB1ENR |= 0x20000000;                                // Enable clock for DAC
-     DAC->CR |= 0x00000001;                                     // DAC control reg, both channels ON
-     GPIOA->MODER |= 0x00000300;                                // PA04 as analog output  
-    }
+}
+
 
-void Init_All_HW(GPIOStruct *gpio){
+
+
+void Inverter::Init(){
     wait_ms(100);
     Init_ADC();
     wait(0.1);         
+    Init_PWM();
     
-    //Init_DAC();
-    wait(0.1);
+    }
     
-    Init_PWM(gpio);
+void Inverter::zero_current(){
+    int adc1_offset_s = 0;
+    int adc2_offset_s = 0;
+    int n = 1024;
+    for (int i = 0; i<n; i++){
+        ADC1->CR  |= ADC_CR_ADSTART;  
+        //wait_us(5);
+        for (volatile int t = 0; t < 16; t++) {}
+        adc2_offset_s += ADC2->DR;
+        adc1_offset_s += ADC1->DR;
+        }
+    adc1_offset = adc1_offset_s/n;
+    adc2_offset = adc2_offset_s/n;
+
+    }
     
-    }
\ No newline at end of file
+void Inverter::ADCsync() {
+    //EXTEN[1:0] = 01
+    //EXTSEL[3:0] = 1010
+    
+    //this code works to slave to center of TIM1 update
+    ADC1->CFGR |= ADC_CFGR_EXTEN_0 | ADC_CFGR_EXTEN_1;
+    ADC1->CFGR |= ADC_CFGR_EXTSEL_3 | ADC_CFGR_EXTSEL_1;
+    TIM1->CR2 |= TIM_CR2_MMS2_1;
+    ADC1->CR  |= ADC_CR_ADSTART; 
+}
+
+
+    
\ No newline at end of file