void iiC_broken()//I2C配置失败 { //处理方式太SB,要改 while(1)//设置输出为0 { setPwm(1,0); setPwm(2,0); setPwm(3,0); setPwm(4,0); setPwm(5,0); } }
void changeChargeMode(volatile uint8_t *array8){ if(array8[numDischargeCharge]!=0){ //Если кол-во итераций разрядки - зарядки не достигло 0 if(array8[charge]) { //Если режим зарядки safeTimeCharge[indDisCharge][indChargeTime]=chargeTime; chargeTime=0; array8[numDischargeCharge]--; USART_SendChar('N'); sendDigitalUsart(indDisCharge+1); USART_SendChar('C'); sendDigitalUsart(safeTimeCharge[indDisCharge][indChargeTime]); USART_SendChar('D'); sendDigitalUsart(safeTimeCharge[indDisCharge][indDischargeTime]); indDisCharge++; if(array8[numDischargeCharge]==0){ setPwm(0); } } else { safeTimeCharge[indDisCharge][indDischargeTime]=dischargeTime; dischargeTime=0; } array8[charge]^=1; initCharge(array8); } }
void MotorController::speed(int motorNumber, int speed) { if(speed > 0) { forward(motorNumber); setPwm(motorNumber, speed); } else if(speed < 0) { reverse(motorNumber); speed *= -1; setPwm(motorNumber, speed); } else { setPwm(motorNumber, 0); } }
// Once calibrated this is the function used bool setSteps(int _iSteps) { if ( m_fPwmMin <= _iSteps && _iSteps <= m_fPwmMax ) { setPwm( _iSteps ); } else { return true; } return false; }
// value 0..255 void analogWrite(uint8_t analogOutPin, uint16_t value) { static uint8_t initFlags=0; if((initFlags&(1<<analogOutPin))==0) { init_sct(analogOutPin); initFlags|=1<<analogOutPin; } setPwm(analogOutPin,value*4); // scale value to 1023 for Arduino Uno compatibility }
uint16_t changePWM(uint16_t adc,uint16_t normalValue){ uint16_t pwm=0; GET_16BIT_RG(pwm,OCR1A); if(adc>normalValue){ if(adc>0){ pwm--; } } else if(adc<normalValue && adc>10){ if(pwm<1023){ pwm++; } } setPwm(pwm); return pwm; }
void updateServo(void) { static int servoDirection = 1; if (servoDirection) { servoPulse += servoSpeed; if (servoPulse >= servoMax) { servoDirection = 0; servoPulse = servoMax; } } else { servoPulse -= servoSpeed; if (servoPulse <= servoMin) { servoDirection = 1; servoPulse = servoMin; } } setPwm(1,servoPulse); // setPwm(2,(servoPulse - servoMin) << 4); }
void showAndSetValue(uint8_t display ,volatile uint16_t *array,volatile uint8_t *array8){ switch(display){ case DISPLAY_START: { volatile uint16_t time=(array8[charge])? chargeTime:dischargeTime; volatile uint8_t index=(array8[charge])? oldChargeTime:oldDischargeTime; if(array[index]!=time){ array[index]=time; showTime(8,1,time); } } if(array[oldCurrentVoltage]!=array[currentVoltage]){ array[oldCurrentVoltage]=array[currentVoltage]; showADC(2,0,array[currentVoltage]); } if(array[oldCurrentAmperage]!=array[currentAmperage]){ array[oldCurrentAmperage]=array[currentAmperage]; LCD_Goto(2,1); volatile uint8_t ch=(array8[charge])? '+':'-'; LCD_WriteData(ch); showADC(3,1,array[currentAmperage]); } if(array[oldCurrentPWM]!=array[currentPWM]){ array[oldCurrentPWM]=array[currentPWM]; showPWM(10,0,array[currentPWM]); setPwm(array[currentPWM]); } if(array8[oldNumDischargeCharge]!=array8[numDischargeCharge]){ array8[oldNumDischargeCharge]=array8[numDischargeCharge]; LCD_Goto(14,0); LCD_SendNumber(array8[numDischargeCharge],' '); } break; case DISPLAY_FAST_CHANGE: if(array8[oldCharge]!=array8[charge]){ array8[oldCharge]=array8[charge]; LCD_ClearField(0,1,9); LCD_Goto(0,1); if(array8[charge]){ LCD_SendStr("Charge"); BM_ClearBit(TCCR1A,COM1A0); SET_CHARGE; }else{ LCD_SendStr("Discharge"); BM_SetBit(TCCR1A,COM1A0); SET_DISCHARGE; } } break; case DISPLAY_PROGR: if(array[oldWindowsSettings]!=array[windowsSettings]){ array[oldWindowsSettings]=array[windowsSettings]; showWinSettings(0,1,DISPLAY_PROGR+array[windowsSettings]); } break; case DISPLAY_P0: if(array[oldNormalVoltage]!=array[normalVoltage]){ array[oldNormalVoltage]=array[normalVoltage]; showADC(0,0,array[normalVoltage]); } break; case DISPLAY_P1: if(array[oldDischargeVoltage]!=array[dischargeVoltage]){ array[oldDischargeVoltage]=array[dischargeVoltage]; showADC(0,0,array[dischargeVoltage]); } break; case DISPLAY_P2: if(array[oldDischargeAmperage]!=array[dischargeAmperage]){ array[oldDischargeAmperage]=array[dischargeAmperage]; showADC(0,1,array[dischargeAmperage]); } break; case DISPLAY_P3: if(array[oldNormalAmperage]!=array[normalAmperage]){ array[oldNormalAmperage]=array[normalAmperage]; showADC(7,1,array[normalAmperage]); } break; case DISPLAY_P4: if(array8[oldAutomatic]!=array8[automatic]){ array8[oldAutomatic]=array8[automatic]; LCD_ClearField(0,1,9); LCD_Goto(0,1); if(array8[automatic]){ LCD_SendStr("Automatic"); } else { LCD_SendStr("Manual"); } } break; case DISPLAY_P5: if(array8[oldNumDischargeCharge]!=array8[numDischargeCharge]){ array8[oldNumDischargeCharge]=array8[numDischargeCharge]; LCD_ClearField(0,1,3); LCD_Goto(0,1); LCD_SendNumber(array8[numDischargeCharge],' '); } break; } }
int main( void ) { /* DDRB=1; while(1){ BM_SetBit(PORTB,0); _delay_ms(10); BM_ClearBit(PORTB,0); _delay_ms(10); } */ volatile uint8_t stateButtons=STATE_NO_BUTTONS; volatile uint8_t switchMeasuring = MEASURING_VOLTAGE; volatile uint8_t arrVal8[oldAutomatic+1]; pCharge=& arrVal8[charge]; arrVal8[charge]=0; arrVal8[automatic]=1; arrVal8[numDischargeCharge]=2; volatile uint16_t arrVal[oldWindowsSettings+1]; arrVal[normalAmperage]=120; arrVal[normalVoltage]=15; arrVal[dischargeVoltage]=10; arrVal[dischargeAmperage]=100; arrVal[currentPWM]=250; arrVal[currentVoltage]=0; arrVal[currentAmperage]=0; arrVal[windowsSettings]=1; volatile uint8_t currentDisplay=DISPLAY_START; volatile uint8_t oldCurrentDisplay=1; volatile uint16_t timeResetDisplay=100; USART_Init(); //инициализируем дисплей DDRD|=(1<<PD6); initCharge(arrVal8); LCD_Init(); ADC_Init(); TIMER0_Init(); initButtons(); initPWM(); setPwm(arrVal[currentPWM]); setZeroOldValue(arrVal,arrVal8); StartConvAdc(); sei(); while(1){ volatile uint8_t codeButton=PINX_BUTTON & MASK_BUTTONS; if(stateButtons!=STATE_ENTER_5SEC && codeButton!=NO_BUTTONS ){ stateButtons=getStateButton(codeButton); timeResetDisplay=currentTime+5; _delay_ms(250); switch(stateButtons){ case STATE_ENTER: switch(currentDisplay){ case DISPLAY_START:currentDisplay=DISPLAY_FAST_CHANGE;break; case DISPLAY_FAST_CHANGE:currentDisplay=DISPLAY_START;break; case DISPLAY_PROGR:currentDisplay=DISPLAY_PROGR+arrVal[windowsSettings];break; default:currentDisplay=DISPLAY_PROGR; } break; case STATE_ENTER_5SEC: if(currentDisplay>DISPLAY_P0){ currentDisplay=DISPLAY_START; }else{ currentDisplay=DISPLAY_PROGR; } break; default: switch(currentDisplay){ case DISPLAY_FAST_CHANGE: arrVal8[charge]^=1; setPwm(512);//Установка в 50 % при смене режима break; case DISPLAY_PROGR: arrVal[windowsSettings]=changeVauleFromButtons(arrVal[windowsSettings],LAST_DISPLAY,stateButtons); if(arrVal[windowsSettings]==(LAST_DISPLAY+1)){ arrVal[windowsSettings]=1; }else if(arrVal[windowsSettings]==0){ arrVal[windowsSettings]=1; } break; case DISPLAY_P0: arrVal[normalVoltage]=changeVauleFromButtons(arrVal[normalVoltage],240,stateButtons); break; case DISPLAY_P1: arrVal[dischargeVoltage]=changeVauleFromButtons(arrVal[dischargeVoltage],240,stateButtons); break; case DISPLAY_P2: arrVal[dischargeAmperage]=changeVauleFromButtons(arrVal[dischargeAmperage],1000,stateButtons); break; case DISPLAY_P3: arrVal[normalAmperage]=changeVauleFromButtons(arrVal[normalAmperage],1022,stateButtons); break; case DISPLAY_P4: arrVal8[automatic]^=1; break; case DISPLAY_P5: arrVal8[numDischargeCharge]=changeVauleFromButtons(arrVal8[numDischargeCharge],10,stateButtons); if(arrVal8[numDischargeCharge]==11){ arrVal8[numDischargeCharge]=1; } break; } } } else if(codeButton==NO_BUTTONS) { if(currentDisplay!=DISPLAY_START){ if(currentTime>timeResetDisplay){ currentDisplay=DISPLAY_START; } } if(stateButtons==STATE_ENTER_5SEC){ stateButtons=STATE_NO_BUTTONS; } } if(numberMeasure>=NUMBER_OF_MEASURING){ adcResult=getNormalADC(adcResult); switch (switchMeasuring) { case MEASURING_VOLTAGE: switchMeasuring=MEASURING_CURRENT; arrVal[currentVoltage]=adcResult; //Отключаем если автомат режим if(arrVal8[automatic] && (arrVal[currentVoltage]<=arrVal[dischargeVoltage] || arrVal[currentVoltage]>=arrVal[normalVoltage])){ changeChargeMode(arrVal8); } break; case MEASURING_CURRENT: arrVal[currentAmperage]=adcResult; volatile uint8_t normal; if(arrVal8[automatic]){ normal=(arrVal8[charge])?normalAmperage:dischargeAmperage; //Изменяем наше текущее значение ШИМ если оно не в норме if(arrVal[currentAmperage]!=arrVal[normal]){ arrVal[currentPWM]=changePWM(arrVal[currentAmperage],arrVal[normal]); } } switchMeasuring=MEASURING_VOLTAGE; break; } //Смена первым идет измерение напряжение ADC0 - напряжения //Потом меняем на измерение ADC2 -ток SWITCH_ADC_CHANNEL(ADMUX,CHANNEL_CURRENT); _delay_us(250); adcResult=0; numberMeasure=0; StartConvAdc(); } if(oldCurrentDisplay!=currentDisplay){ oldCurrentDisplay=currentDisplay; setZeroOldValue(arrVal,arrVal8); showCurrentDisplay(currentDisplay); } showAndSetValue(currentDisplay,arrVal,arrVal8); } return 0; }
// This function is used only for calibration purposes void setCalibSteps(int _iSteps) { setPwm( _iSteps ); }