void pwm_write(void) { uint32_t r_on, g_on, b_on; uint32_t r_off, g_off, b_off; r_on = (rgb[0] / 255.0) * PERIOD; g_on = (rgb[1] / 255.0) * PERIOD; b_on = (rgb[2] / 255.0) * PERIOD; r_on = MAX(1, r_on); g_on = MAX(1, g_on); b_on = MAX(1, b_on); r_off = PERIOD - r_on; g_off = PERIOD - g_on; b_off = PERIOD - b_on; r_off = MAX(1, r_off); g_off = MAX(1, g_off); b_off = MAX(1, b_off); printk("rgb: %x %x %x\n", rgb[0], rgb[1], rgb[2]); printk("on : %x %x %x\n", r_on, g_on, b_on); printk("off: %x %x %x\n", r_off, g_off, b_off); pwm_pin_set_values(pwm, IO3_RED, r_on, r_off); pwm_pin_set_values(pwm, IO5_GREEN, g_on, g_off); pwm_pin_set_values(pwm, IO6_BLUE, b_on, b_off); }
void main(void) { struct nano_timer timer; void *timer_data[1]; struct device *pwm_dev; uint32_t period; uint8_t dir; nano_timer_init(&timer, timer_data); PRINT("PWM_DW demo app\n"); pwm_dev = device_get_binding(CONFIG_PWM_DW_DEV_NAME); if (!pwm_dev) { PRINT("Cannot find %s!\n", CONFIG_PWM_DW_DEV_NAME); } period = MAX_PERIOD; dir = 0; while (1) { pwm_pin_set_values(pwm_dev, 0, period, period); if (dir) { period *= 2; if (period > MAX_PERIOD) { dir = 0; period = MAX_PERIOD; } } else { period /= 2; if (period < MIN_PERIOD) { dir = 1; period = MIN_PERIOD; } } nano_timer_start(&timer, SLEEPTICKS); nano_timer_test(&timer, TICKS_UNLIMITED); } }