コード例 #1
0
ファイル: mhc_I2C.c プロジェクト: mhc994/FLY_GitHub
void iiC_broken()//I2C配置失败
{
	//处理方式太SB,要改
	while(1)//设置输出为0
	{
		setPwm(1,0);
		setPwm(2,0);
		setPwm(3,0);
		setPwm(4,0);
		setPwm(5,0);
	}
}
コード例 #2
0
ファイル: LCD_VP.c プロジェクト: Freerider82/ChargeAVR
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);
	}
}
コード例 #3
0
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);
    }
}
コード例 #4
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;
 }
コード例 #5
0
ファイル: arduino.c プロジェクト: ChrisMicro/OpenLasp
// 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
}
コード例 #6
0
ファイル: LCD_VP.c プロジェクト: Freerider82/ChargeAVR
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;
}
コード例 #7
0
ファイル: servo.c プロジェクト: racnets/linSen-fw
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);
}
コード例 #8
0
ファイル: LCD_VP.c プロジェクト: Freerider82/ChargeAVR
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;
	}
}
コード例 #9
0
ファイル: LCD_VP.c プロジェクト: Freerider82/ChargeAVR
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;
}
コード例 #10
0
 // This function is used only for calibration purposes
 void setCalibSteps(int _iSteps) {
   setPwm( _iSteps );
 }