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); }
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; }
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 }
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); } } }
void cmd_pwm_setscalar(char* params){ pwm_set_scalar(params[0]); }