Skip to content

Commit

Permalink
Revert "a working sensorless control using active current to control …
Browse files Browse the repository at this point in the history
…voltage and reactive current to control frequency"

This reverts commit 4830139.
  • Loading branch information
catphish committed Jul 21, 2018
1 parent 4830139 commit a1ac313
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 65 deletions.
92 changes: 35 additions & 57 deletions main.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,17 +9,8 @@ uint16_t adc_data[4];

int sine_angle = 0;
int frequency = 1;
int voltage = 0;

int v1, v2;
int va, vb;

int i1, i2;
int ia, ib;

int id, iq;

float vangle;
float i1, i2, total_current;

void uart_write_string(char* str);
void uart_write_int(int32_t i);
Expand All @@ -44,84 +35,63 @@ void update_svm(uint32_t phase, uint32_t voltage)
switch(sine_segment) {
case 0:
// 100 -> 110
TIM1->CCR1 = ((voltage+1) * table[sine_angle] - 1) >> 9;
TIM1->CCR3 = ((voltage+1) * table[sine_angle] - 1) >> 9;
TIM1->CCR2 = ((sine_angle + 1) * (voltage+1) * table[sine_angle] - 1) >> 19;
TIM1->CCR3 = 0;
TIM1->CCR1 = 0;
break;

case 1:
// 110 -> 010
TIM1->CCR1 = ((1024 - sine_angle) * (voltage+1) * table[sine_angle] - 1) >> 19;
TIM1->CCR3 = ((1024 - sine_angle) * (voltage+1) * table[sine_angle] - 1) >> 19;
TIM1->CCR2 = ((voltage+1) * table[sine_angle] - 1) >> 9;
TIM1->CCR3 = 0;
TIM1->CCR1 = 0;
break;

case 2:
// 010 -> 011
TIM1->CCR1 = 0;
TIM1->CCR3 = 0;
TIM1->CCR2 = ((voltage+1) * table[sine_angle] - 1) >> 9;
TIM1->CCR3 = ((sine_angle + 1) * (voltage+1) * table[sine_angle] - 1) >> 19;
TIM1->CCR1 = ((sine_angle + 1) * (voltage+1) * table[sine_angle] - 1) >> 19;
break;

case 3:
// 011 -> 001
TIM1->CCR1 = 0;
TIM1->CCR3 = 0;
TIM1->CCR2 = ((1024 - sine_angle) * (voltage+1) * table[sine_angle] - 1) >> 19;
TIM1->CCR3 = ((voltage+1) * table[sine_angle] - 1) >> 9;
TIM1->CCR1 = ((voltage+1) * table[sine_angle] - 1) >> 9;
break;

case 4:
// 001 -> 101
TIM1->CCR1 = ((sine_angle + 1) * (voltage+1) * table[sine_angle] - 1) >> 19;
TIM1->CCR3 = ((sine_angle + 1) * (voltage+1) * table[sine_angle] - 1) >> 19;
TIM1->CCR2 = 0;
TIM1->CCR3 = ((voltage+1) * table[sine_angle] - 1) >> 9;
TIM1->CCR1 = ((voltage+1) * table[sine_angle] - 1) >> 9;
break;

case 5:
// 101 -> 100
TIM1->CCR1 = ((voltage+1) * table[sine_angle] - 1) >> 9;
TIM1->CCR3 = ((voltage+1) * table[sine_angle] - 1) >> 9;
TIM1->CCR2 = 0;
TIM1->CCR3 = ((1024 - sine_angle) * (voltage+1) * table[sine_angle] - 1) >> 19;
TIM1->CCR1 = ((1024 - sine_angle) * (voltage+1) * table[sine_angle] - 1) >> 19;
break;
}
}

// This runs at 80000000/8192 = 9765.625Hz
void DMA1_Channel1_IRQHandler(void) {
v1 = TIM1->CCR1 + TIM1->CCR1 - TIM1->CCR2 - TIM1->CCR3;
v2 = TIM1->CCR2 + TIM1->CCR2 - TIM1->CCR1 - TIM1->CCR3;

va = v1;
vb = 0.577350269f * (float)v1 + 1.154700538 * (float)v2;

i1 = adc_data[0] - 32840;
i2 = adc_data[1] - 32840;
//i1 = adc_data[0] - 32845;
//i2 = adc_data[1] - 32770;

ia = i1;
ib = 0.577350269f * (float)i1 + 1.154700538 * (float)i2;
i1 = (adc_data[0] - 31710)/5242.88;
i2 = (adc_data[1] - 31795)/5242.88;

vangle = atan2f(vb, va);
// Calculate instantaneous total current
total_current = sqrtf(2*(i1*i1+i2*i2+i1*i2));

id = ia * cosf(vangle) + ib * sinf(vangle);
iq = ia * sinf(vangle) - ib * cosf(vangle);
// Calculate fixed voltage drop based on current and known resistance (8 ohm)
// Scale RMS to peak voltage
float resistive_waste = (total_current / 3 * sqrt(2)) * 8;

// 10308 = 1Hz
// adc_data[3] = 0-65535
// fMax = 25.43Hz
//frequency = adc_data[3]*4;

if(iq < 800) frequency -= 50;
if(iq > 800) frequency += 50;
if(frequency < 40000) frequency = 40000;

if(id < 2000) voltage += 10;
if(id > 2000) voltage -= 10;
if(voltage > 4000) voltage = 4000;

//int voltage = 4000; //frequency / 12.885f;
//if(voltage > 4000) voltage = 4000;
frequency = 10308 * 5;
int voltage = 4000;

// Increment angle
sine_angle += frequency;
Expand All @@ -142,14 +112,22 @@ void TIM1_UP_TIM16_IRQHandler(void) {
int main() {
while(1) {
// Debug output
uart_write_int(id);
uart_write_int(i1*1000);
uart_write_string(",");
uart_write_int(iq);
uart_write_int(i2*1000);
uart_write_string(",");
uart_write_int(frequency);

uart_write_int(total_current*1000);
//uart_write_string(",");
//uart_write_int(adc_data[3]);
// uart_write_int(i3);
// uart_write_string(",");
// uart_write_int(iangle);
// uart_write_string(",");
// uart_write_int(vangle);
// uart_write_string(",");
// uart_write_int(i3);
uart_write_nl();
int n; for(n=0;n<10000;n++) nop();
int n; for(n=0;n<1000000;n++) nop();

}
}
16 changes: 8 additions & 8 deletions system.c
Original file line number Diff line number Diff line change
Expand Up @@ -73,8 +73,8 @@ void SystemInit() {
// Disable USART2
USART2->CR1 = 0;
// Set data rate
//USART2->BRR = 694; //115200
USART2->BRR = 80; //1M
USART2->BRR = 694; //115200
//USART2->BRR = 80; //1M
// Enable USART2
USART2->CR1 |= USART_CR1_UE;
// Enable transmit
Expand Down Expand Up @@ -114,12 +114,12 @@ void SystemInit() {
//ADC2->DIFSEL |= (1<<5);

// Calibrate
ADC1->CR |= ADC_CR_ADCAL;
ADC2->CR |= ADC_CR_ADCAL;
while(ADC1->CR & ADC_CR_ADCAL);
while(ADC2->CR & ADC_CR_ADCAL);
// Wait a bit
for(n=0;n<100000;n++) nop();
// ADC1->CR |= ADC_CR_ADCAL;
// ADC2->CR |= ADC_CR_ADCAL;
// while(ADC1->CR & ADC_CR_ADCAL);
// while(ADC2->CR & ADC_CR_ADCAL);
// // Wait a bit
// for(n=0;n<100000;n++) nop();

// Enable procedure
ADC1->ISR |= ADC_ISR_ADRDY;
Expand Down

0 comments on commit a1ac313

Please sign in to comment.