void pwm_init(){ //PWM output active (pin5) DDRE |= (1<<PE3); //CS3{2:0} = 011 prescaler set to 64 /* TCCR3B |= (1<<CS30) | (1 << CS31); TCCR3B &= ~(1<<CS32);*/ //CS3{2:0} = 010 prescaler set to 8 TCCR3B |= (1<<CS31); TCCR3B &= ~((1<<CS32) | (1<<CS30)); //WGM3{3:0} = 1110 mode set to fast PWM TCCR3A |= (1<<WGM31); TCCR3A &= ~(1<<WGM30); TCCR3B |= (1<<WGM33) | (1<<WGM32); //COM3A{1:0} = 10 clear bit on ICR3 compare TCCR3A |= (1<<COM3A1); TCCR3A &= ~(1<<COM3A0); //Setting ICR3 to DUTY_CYCLE_STEPS (20ms) ICR3 = DUTY_CYCLE_STEPS; pwm_set_value(MID_SERVO); }
void UART0_IRQHandler(void){ //disable interrupt U0IER = 0x0; /* char s[11]; char a = U0RBR; for(int i = 0;i<100;i++){ itoa(array[i],s,10); USART0_String(s); USART0_Transmit('\r'); USART0_Transmit('\n'); } */ //USART_Handler(); char s[12]; int tmp = 0; s[0] = U0RBR; for(tmp=1;tmp<11;tmp++){ s[tmp] = USART0_Receive(); if(s[tmp] == '\n') break; } s[tmp+1] = '\0'; tmp = (int)strtol(s, NULL, 10); pwm_set_value(FAN_ADC, tmp); //heater_set_temp(EXTRUDER_ADC, tmp); //STEPS_PER_M_E = tmp; char a[12]; itoa(tmp, a, 10); USART0_String(a); USART0_Transmit('\n'); //enable interrupt U0IER = 0x1; }
void pwm_test(){ pwm_set_value(150); }
void pwm_set_servo(int16_t val){ val += 128; //printf("%d\n", val); val = (val*(VAL_SCALE/UNDERFLOW_FIX)) / 255 * UNDERFLOW_FIX + MIN_SERVO; pwm_set_value(val); }
/* DDRH = (1 << DDH6); //fast pwm TCCR4A &= ~(1 << WGM40); TCCR4A |= (1 << WGM41); TCCR4B |= (1 << WGM42) | (1 << WGM43); //set non-inverting TCCR4A &= ~(1 << COM4A0); TCCR4A |= (1 << COM4A1); //set prescaler TCCR4B |= (1 << CS41); TCCR4B &= ~((1 << CS42)|(1 << CS40)); //Set duty cycle? ICR4 = F_CPU/prescaler/1000*20; //Set on time? OCR4A = 2/1000*F_CPU/prescaler; */ } void pwm_set_value(unsigned int val){ OCR3A = val; } void pwm_test(void){ pwm_set_value(150) }