1
0
mirror of https://github.com/whowechina/iidx_pico.git synced 2024-11-12 01:10:50 +01:00

Turntable noise filtering and debouncing

This commit is contained in:
whowe 2024-06-08 10:46:03 +08:00
parent 671bb98cb2
commit 87c7251701
4 changed files with 39 additions and 8 deletions

1
.gitignore vendored
View File

@ -3,3 +3,4 @@ PCB/Turntable/iidx_tt-backups/
PCB/Keyboard/iidx_pico-backups/ PCB/Keyboard/iidx_pico-backups/
Production/PCB/Turntable Production/PCB/Turntable
Production/PCB/Keyboard Production/PCB/Keyboard
build

Binary file not shown.

View File

@ -92,7 +92,7 @@ static void core1_loop()
static void core0_loop() static void core0_loop()
{ {
uint64_t next_frame = 0; absolute_time_t next_frame = {0};
while (true) while (true)
{ {
@ -114,7 +114,7 @@ static void core0_loop()
cli_fps_count(0); cli_fps_count(0);
sleep_until(next_frame); sleep_until(next_frame);
next_frame = time_us_64() + 1000; // 1KHz next_frame = make_timeout_time_us(1000);
} }
} }

View File

@ -22,7 +22,7 @@ static uint16_t angle = 0;
static void init_i2c() static void init_i2c()
{ {
i2c_init(TT_AS5600_I2C, 573 * 1000); i2c_init(TT_AS5600_I2C, 400 * 1000);
gpio_set_function(TT_AS5600_SCL, GPIO_FUNC_I2C); gpio_set_function(TT_AS5600_SCL, GPIO_FUNC_I2C);
gpio_set_function(TT_AS5600_SDA, GPIO_FUNC_I2C); gpio_set_function(TT_AS5600_SDA, GPIO_FUNC_I2C);
gpio_set_drive_strength(TT_AS5600_SCL, GPIO_DRIVE_STRENGTH_8MA); gpio_set_drive_strength(TT_AS5600_SCL, GPIO_DRIVE_STRENGTH_8MA);
@ -36,16 +36,46 @@ void turntable_init()
init_i2c(); init_i2c();
} }
void turntable_update() static int read_angle()
{ {
const uint8_t as5600_addr = 0x36; const uint8_t as5600_addr = 0x36;
uint8_t buf[2] = {0x0c, 0x00}; uint8_t buf[2] = {0x0c, 0x00};
i2c_write_blocking_until(TT_AS5600_I2C, as5600_addr, buf, 1, true, int ret = i2c_write_blocking_until(TT_AS5600_I2C, as5600_addr, buf, 1, true,
make_timeout_time_ms(1)); make_timeout_time_ms(1));
i2c_read_blocking_until(TT_AS5600_I2C, as5600_addr, buf, 2, false, if (ret != 1) {
make_timeout_time_ms(1)); return -1;
}
angle = ((uint16_t)buf[0] & 0x0f) << 8 | buf[1]; ret = i2c_read_blocking_until(TT_AS5600_I2C, as5600_addr, buf, 2, false,
make_timeout_time_ms(1));
if (ret != 2) {
return -1;
}
return (buf[0] & 0x0f) << 8 | buf[1];
}
void turntable_update()
{
int candidate = read_angle();
if (candidate < 0) {
return;
}
for (int i = 0; i < 2; i++) {
int update = read_angle();
if (abs(update - candidate) > 2) {
return;
}
if (update > candidate) {
candidate++;
} else if (update < candidate) {
candidate--;
}
}
angle = candidate;
} }
uint16_t turntable_raw() uint16_t turntable_raw()