/* * AlphaController.c * * Created: 08.10.2020 11:02:15 * Author : Yll */ #define F_CPU 16000000UL #include #include int rhythm [101]= {1, 2, 2, 4, 5, 2, 3, 1, 8, 10, 10, 2, 2, 6, 2, 3, 8, 1, 3, 20, 3, 1, 2, 5, 25, 6, 2, 1, 1, 2, 3, 7, 32, 16, 6, 4, 2, 2, 1, 1, 1, 2, 2, 3, 4, 5, 7, 11, 24, 50, 25, 12, 8, 6, 5, 4, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 8, 9, 11, 12, 15, 18, 23, 31, 48, 98, 100}; int durationShort [101]= {100, 50, 33, 25, 20, 16, 14, 12, 11, 10, 9, 8, 7, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; int durationLong [101]= {0, 0, 34, 0, 0, 17, 15, 13, 12, 0, 10, 9, 8, 8, 7, 7, 6, 6, 6, 0, 5, 5, 5, 5, 0, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0}; //-----------------------alpha angle percentage arrays for modes 3, 4, 5------------------------------------- double fireAngleTable [101]= {1, 0.99, 0.98, 0.97, 0.96, 0.95, 0.94, 0.93, 0.92, 0.91, 0.9, 0.89, 0.88, 0.87, 0.86, 0.85, 0.84, 0.83, 0.82, 0.81, 0.8, 0.79, 0.78, 0.77, 0.76, 0.75, 0.74, 0.73, 0.72, 0.71, 0.7, 0.69, 0.68, 0.67, 0.66, 0.65, 0.64, 0.63, 0.62, 0.61, 0.6, 0.59, 0.58, 0.57, 0.56, 0.55, 0.54, 0.53, 0.52, 0.51, 0.5, 0.49, 0.48, 0.47, 0.46, 0.45, 0.44, 0.43, 0.42, 0.41, 0.4, 0.39, 0.38, 0.37, 0.36, 0.35, 0.34, 0.33, 0.32, 0.31, 0.3, 0.29, 0.28, 0.27, 0.26, 0.25, 0.24, 0.23, 0.22, 0.21, 0.2, 0.19, 0.18, 0.17, 0.16, 0.15, 0.14, 0.13, 0.12, 0.11, 0.1, 0.09, 0.08, 0.07, 0.06, 0.05, 0.04, 0.03, 0.02, 0.01, 0}; double fireAngleTableV [101]= {1, 0.975, 0.96, 0.95, 0.935, 0.925, 0.92, 0.91, 0.9, 0.89, 0.885, 0.875, 0.87, 0.86, 0.855, 0.845, 0.84, 0.835, 0.825, 0.82, 0.815, 0.805, 0.8, 0.795, 0.79, 0.78, 0.775, 0.77, 0.765, 0.755, 0.75, 0.745, 0.74, 0.735, 0.725, 0.72, 0.715, 0.71, 0.705, 0.695, 0.69, 0.685, 0.68, 0.675, 0.67, 0.66, 0.655, 0.65, 0.645, 0.64, 0.63, 0.625, 0.62, 0.615, 0.61, 0.6, 0.595, 0.59, 0.585, 0.575, 0.57, 0.565, 0.56, 0.55, 0.545, 0.54, 0.53, 0.525, 0.52, 0.51, 0.505, 0.5, 0.49, 0.485, 0.475, 0.47, 0.46, 0.455, 0.445, 0.435, 0.43, 0.42, 0.41, 0.405, 0.395, 0.385, 0.375, 0.365, 0.355, 0.34, 0.33, 0.315, 0.305, 0.29, 0.275, 0.255, 0.235, 0.215, 0.185, 0.145, 0}; double fireAngleTableP [101]= {1, 0.885, 0.855, 0.83, 0.815, 0.8, 0.785, 0.77, 0.76, 0.75, 0.74, 0.73, 0.725, 0.715, 0.705, 0.7, 0.69, 0.685, 0.675, 0.67, 0.665, 0.655, 0.65, 0.645, 0.64, 0.63, 0.625, 0.62, 0.615, 0.61, 0.605, 0.6, 0.595, 0.585, 0.58, 0.575, 0.57, 0.565, 0.56, 0.555, 0.55, 0.545, 0.54, 0.535, 0.53, 0.525, 0.52, 0.515, 0.51, 0.505, 0.5, 0.495, 0.49, 0.485, 0.48, 0.475, 0.47, 0.465, 0.46, 0.455, 0.45, 0.445, 0.44, 0.435, 0.43, 0.425, 0.42, 0.415, 0.405, 0.4, 0.395, 0.39, 0.385, 0.38, 0.375, 0.37, 0.36, 0.355, 0.35, 0.345, 0.335, 0.33, 0.325, 0.315, 0.31, 0.3, 0.295, 0.285, 0.275, 0.27, 0.26, 0.25, 0.24, 0.23, 0.215, 0.2, 0.185, 0.17, 0.145, 0.115, 0}; int netzT = 10000; //-----------------------control values--------------------------- volatile int mode = 1; volatile int ctrlVal1 = 0; volatile int ctrlVal2 = 0; volatile int ctrlVal3 = 0; //-----------------------variables for timing and synchronisation-------- volatile int intCounter = 0; volatile int intCounterPhaseA = 67; volatile int intCounterPhaseB = 133; volatile int timerCounter = 0; volatile int timerCounterA = 0; volatile int timerCounterB = 0; volatile int bufferIdx = 0; volatile int uartFlag = 0; volatile char uartBuffer; volatile char buffer[10]; //-----------------------variables for mode 7 control, not implemented yet int lNumber, sNumber; int burstCh1 [5]= {0, 0, 0, 0, 0}; //{sTime, sNumber, lTime, lNumber, rhythm} int burstCh2 [5]= {0, 0, 0, 0, 0}; int burstCh3 [5]= {0, 0, 0, 0, 0}; char delimiter[] = "-"; volatile char input[50]; //function declarations void SSR1on(); void SSR1off(); void SSR2on(); void SSR2off(); void SSR3Aon(); void SSR3Aoff(); void SSR3Bon(); void SSR3Boff(); void SSR3Con(); void SSR3Coff(); void Init_Int0(); void Init_Timer_0(); void USART_Init(); unsigned char uart_getc(); void uart_gets( char* Buffer, uint8_t MaxLen, char endChar); void requestControlVals(); void getAdcVals(); void calcBurstVals(); void uart_sendc(char c); int main(void) { Init_Int0(); Init_Timer_0(); USART_Init(); sei(); DDRB = 0xFF; while(1) { if (intCounter == 200) { intCounter = 0; uart_sendc('r'); //Request Control Values } if(uartFlag == 1 && uartBuffer != '#') { input[bufferIdx] = uartBuffer; bufferIdx++; uartFlag = 0; } else if (uartFlag == 1 && uartBuffer == '#') { bufferIdx++; input[bufferIdx] = '\0'; char* token = strtok(input, "-"); mode = atoi(token); token = strtok(0, "-"); ctrlVal1 = atoi(token); token = strtok(0, "-"); ctrlVal2 = atoi(token); token = strtok(0, "-"); ctrlVal3 = atoi(token); bufferIdx = 0; uartFlag = 0; } switch(mode) { case 1: //permanent LOW SSR1off(); SSR2off(); SSR3Aoff(); SSR3Boff(); SSR3Coff(); break; case 2: //permanent HIGH SSR1on(); SSR2on(); SSR3Aon(); SSR3Bon(); SSR3Con(); break; case 3: //linear phase angle if(timerCounter > (fireAngleTable[ctrlVal1]*netzT)/50) { //SSR1on(); PORTB |= (1< (fireAngleTable[ctrlVal2]*netzT)/50) { PORTB |= (1< (fireAngleTable[ctrlVal3]*netzT)/50) { PORTB |= (1< (fireAngleTableP[ctrlVal1]*netzT)/50) { SSR1on(); } else { SSR1off(); } break; case 5: //phase angle effective voltage if(timerCounter+1 > (fireAngleTableV[ctrlVal1]*netzT)/50) { SSR1on(); } else { SSR1off(); } break; case 6: //burst fire low momentum if(intCounter+1 > 2*ctrlVal1) { SSR1off(); } else { SSR1on(); } if(intCounter+1 > 2*ctrlVal2) { SSR2off(); } else { SSR2on(); } if(intCounter+1 > 2*ctrlVal3) { SSR3Aoff(); } else { SSR3Aon(); } if(intCounterPhaseA+1 > 2*ctrlVal3) { SSR3Boff(); } else { SSR3Bon(); } if(intCounterPhaseB+1 > 2*ctrlVal3) { SSR3Coff(); } else { SSR3Con(); } break; /*case 7: //burst fire high momentum, muss noch implementiert werden if(intCounter+1 > 2*ctrlVal1) { SSR1on(); } else { SSR1off(); } break;*/ } } } ISR (INT0_vect) { timerCounter = 0; timerCounterA = 0; timerCounterB = 0; intCounter++; intCounterPhaseA++; intCounterPhaseB++; } ISR(USART0_RX_vect) { //Wenn empfangen->wird das ausgefuehrt uartBuffer = uart_getc(); uartFlag = 1; //received STRING z.B. "1-100-099-098" } ISR (TIMER0_COMPA_vect) { timerCounter++; timerCounterA++; timerCounterB++; } unsigned char uart_getc() { while (!(UCSR0A & (1<