mirror of
https://github.com/whowechina/iidx_pico.git
synced 2024-11-28 00:20:50 +01:00
Turntable noise filtering and debouncing
This commit is contained in:
parent
671bb98cb2
commit
87c7251701
1
.gitignore
vendored
1
.gitignore
vendored
@ -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.
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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()
|
||||||
|
Loading…
Reference in New Issue
Block a user