/* * ===================================================================================== * * ________ .__ __ ________ ____ ________ * \_____ \ __ __|__| ____ | | __\______ \ _______ _/_ |/ _____/ * / / \ \| | \ |/ ___\| |/ / | | \_/ __ \ \/ /| / __ \ * / \_/. \ | / \ \___| < | ` \ ___/\ / | \ |__\ \ * \_____\ \_/____/|__|\___ >__|_ \/_______ /\___ >\_/ |___|\_____ / * \__> \/ \/ \/ \/ \/ * * www.optixx.org * * * Version: 1.0 * Created: 07/21/2009 03:32:16 PM * Author: david@optixx.org * * ===================================================================================== */ #include #include #include #include #include "pwm.h" #include "debug.h" #include "info.h" #include "sram.h" #define PWM_SINE_MAX 64 #define PWM_OVERFLOW_MAX 1024 uint8_t pwm_sine_table[] = { 0x7f,0x8b,0x97,0xa4,0xaf,0xbb,0xc5,0xcf,0xd9,0xe1,0xe8,0xef,0xf4,0xf8,0xfb,0xfd, 0xfd,0xfd,0xfb,0xf8,0xf3,0xee,0xe7,0xe0,0xd7,0xce,0xc4,0xb9,0xae,0xa2,0x96,0x89, 0x7e,0x71,0x65,0x59,0x4d,0x42,0x37,0x2d,0x24,0x1c,0x15,0x0f,0x09,0x05,0x03,0x01, 0x01,0x01,0x03,0x07,0x0b,0x11,0x17,0x1f,0x28,0x31,0x3b,0x46,0x52,0x5e,0x6a,0x76 }; volatile uint8_t pwm_setting; // Einstellungen für die einzelnen PWM-Kanäle volatile uint16_t pwm_overflow; // Einstellungen für die einzelnen PWM-Kanäle volatile uint8_t pwm_idx; // Einstellungen für die einzelnen PWM-Kanäle volatile uint16_t pwm_overflow_max; // Einstellungen für die einzelnen PWM-Kanäle ISR(TIMER2_COMPA_vect) { static uint8_t pwm_cnt=0; OCR2A += (uint16_t)T_PWM; if (pwm_setting> pwm_cnt) led_pwm_on(); else led_pwm_off(); if (pwm_cnt==(uint8_t)(PWM_STEPS-1)) pwm_cnt=0; else pwm_cnt++; if (pwm_overflow_max == pwm_overflow++ ){ pwm_setting = pwm_sine_table[pwm_idx++]; pwm_overflow = 0; if (PWM_SINE_MAX == pwm_idx) pwm_idx = 0; } } void pwm_speed(uint16_t val) { pwm_overflow_max = val; } void pwm_speed_slow(uint16_t val) { pwm_overflow_max = PWM_OVERFLOW_MAX * 2 ; } void pwm_speed_fast(uint16_t val) { pwm_overflow_max = PWM_OVERFLOW_MAX / 2; } void pwm_speed_normal(uint16_t val) { pwm_overflow_max = PWM_OVERFLOW_MAX; } void pwm_set(uint8_t val) { pwm_setting = val; } void pwm_stop(void) { while(pwm_setting!=0xfd); TIMSK2 = 0; } void pwm_init(void) { pwm_overflow_max = PWM_OVERFLOW_MAX; pwm_setting = 0x7f; pwm_overflow = 0; //cli(); TCCR2B = 1; TIMSK2 |= (1<