Пример #1
0
void lcd_blt_set_pwm(int no, int level, int freq)
{
	int clock = auto_pll_divisor(DEV_PWM,GET_FREQ, 0, 0);
	int period, duty, scalar;

	clock = clock / freq;
	scalar = 0;
	period = 2000;

	while(period > 1023) {
		scalar++;
		period = clock / scalar;
	}

	duty = (period*level)/100;
	duty = (duty)? (duty-1):0;
	scalar = scalar-1;
	period = period -1;

	pwm_set_period(no,period);
	pwm_set_duty(no,duty);
	pwm_set_scalar(no,scalar);
	if (g_pwm_setting.config)
		pwm_set_control(no,(level)? 0x36:0x8);
	else
	pwm_set_control(no,(level)? 0x34:0x8);
	pwm_set_gpio(no,level);
}
Пример #2
0
static int display_set_pwm(char *val, int on)
{

	if (val == NULL) {
		printf("error : can not get pwm parameter\n");
		return -1;
	}

	lcd_blt_enable(g_pwm_setting.pwm_no, 0);

	parse_pwm_params(NULL, val);

	if ((g_display_vaild&PWMDEFMASK) == PWMDEFTP) {
		lcd_blt_set_pwm(g_pwm_setting.pwm_no, g_pwm_setting.duty, g_pwm_setting.period);
	} else {
		// fan : may need to check PWM power ..
		pwm_set_period(g_pwm_setting.pwm_no, g_pwm_setting.period-1);
		pwm_set_duty(g_pwm_setting.pwm_no, g_pwm_setting.duty-1);
		pwm_set_control(g_pwm_setting.pwm_no, (g_pwm_setting.duty-1)? 0x35:0x8);
		pwm_set_gpio(g_pwm_setting.pwm_no, g_pwm_setting.duty-1);
		pwm_set_scalar(g_pwm_setting.pwm_no, g_pwm_setting.scalar-1);
	}

	lcd_blt_enable(g_pwm_setting.pwm_no, on);

	return 0;
}
Пример #3
0
void lcd_blt_set_pwm(int no,unsigned int scalar,unsigned int period,unsigned int duty)
{
	lcd_pwm_enable = 1;
	lcd_blt_id = no;
#ifdef CONFIG_PWM_WMT
	pwm_set_scalar(lcd_blt_id,scalar);
	pwm_set_period(lcd_blt_id,period);
	pwm_set_duty(lcd_blt_id,duty);
#endif					
}
Пример #4
0
int main(){

	DDRC = 0xDB;
	PORTC = 0x7E;;
	

	
	sei();
	pwm_init();
	pwm_set_scalar(3);
	pwm_set(0x00, 120);
	pwm_set(0x01, 255);
	
	int a;
	while(1){
		a++;
	}

}
int main( void ){

	uint8_t error;
	Packet packet;
	Queue* packets;
	packets = Packets_getQueue();

	// initialize pwm
	pwm_init();
	pwm_set_scalar(1);
	pwm_set(PWM_CHAN_A, 127);

	// initialize Time
	time_init();
	TimeResult tr, rpm_tr;
	uint32_t previous = 0;
	rpm_tr.previous = 0;

	// enable external interrupt for INT0
	//setbit(MCUCR, BIT(ISC01) | BIT(ISC00));
	setbit(MCUCR,BIT(ISC00));
	setbit(GICR, BIT(INT0));

	// initialize rpm counter
	InterruptCounterResult icr; 
	icr.previous = 0;
	float rpm = 0, prev_rpm = 0, time_ms = 0, rpm_delta = 0;

	uint16_t* rpm_target_p;
	float pwm_power = 0;
	float pwm_acc = 0;
	float rpm_target = 0;
	
	rpm_target_p = get_rpm_handle();
	*rpm_target_p =  1000;
	

	// initialize usart
	usart_init();

	// enable interrupts
	sei();

	// set initial value
	pwm_set_scalar(3);
	pwm_set(1,256);

	// loop forever
	while(1){
		error = Packets_getError();
		if (error){
			Packets_sendError(ERROR_PACKETS, error);
			continue;
		}
		if (packets->count > 0){
			error = 0x00;
			packet = Packets_getNext();
			error = Queue_getError(packets);
			if (error){
				Packets_sendError(ERROR_QUEUE, error);
				continue;
			}

			handle_packet(packet);
		}
		tr = time_get_time_delta(previous);
		
		// every 20ms, calculate rpm
		if (get_time_in_ms(tr.delta) > 20){
			previous = tr.previous;
			// calculate RPM
			rpm_tr = time_get_time_delta(rpm_tr.previous);
			icr = interrupt_counter_delta(icr.previous);
			time_ms = get_time_in_ms(rpm_tr.delta);
			rpm =  (double) icr.delta /(double) 32 / (double) time_ms * (double) 1000 * (double) 60;
			
			rpm_target_p = get_rpm_handle();
			rpm_target  = (float) *rpm_target_p;
			rpm_delta = rpm_delta * 0.65 + (rpm - prev_rpm) * 0.35;
			
			
			//pwm_acc = (rpm_target - rpm) * 0.01 - rpm_delta * 0.05;
			pwm_acc = (rpm_target - rpm) * 0.015 - rpm_delta * 0.15;
			
			if (pwm_acc < - pwm_power) pwm_power = 0;
			else if (pwm_acc + pwm_power > 1023) pwm_power = 1023;
			else{
				pwm_power = pwm_power + pwm_acc;
			}

			
			if (rpm_target == 0) pwm_power = 0;
			pwm_set(1,floor(pwm_power));
			prev_rpm = rpm;

			cmd_send_debug16( 'r', (uint16_t) rpm);

			

		}	
	}

	
}
Пример #6
0
void cmd_pwm_setscalar(char* params){
	pwm_set_scalar(params[0]);
}