UAB3QWX6I6PF4BRKRV6C7QKQMEYESRIALOFSOP3P5NAX2SHXABTQC
IPLSYOCQIAQLB6HXL6YBJ5ZKKESCSRO7S7P5SF6I367M6HEJJRNQC
QV2QX6JBHGTRCSTNG4VEW6TMX6ACGBTBUBAX6GJ6J4O4OTJBFA2QC
TXSGLYOVYQ77EG23PAVW62MBJRHS2WTVAVNQ3NYVBDGKNMSYS7DAC
RIKRRTK5ZNVTCDJBS2O54P36TSQXENEZ2DYXJ3WPFW7ZQ6CF4DMQC
GSIKHOXLB6QJELAYIGDFLRIG6DRIQFMZG6ZCQ54BNB7FIDBVI5PAC
6GJR2V3AYCEJWLBP2KMTWUNO332MG5OFEUNPCNSSNF5BJKXA3VTQC
O7V7LAFPWUJJAVSZ67LQWJWX6GKEG6UOGI7FCJZYC7KK7KFZ6GZAC
const pin_conf = pico.pins.GlobalConfiguration{
.GPIO14 = .{ .name = "led", .direction = .out },
.GPIO16 = .{ .name = "mot2", .direction = .out },
.GPIO17 = .{ .name = "mot1", .direction = .out },
.GPIO18 = .{ .name = "speed", .function = .PWM1_A },
.GPIO26 = .{ .name = "m1emf", .function = .ADC0 },
.GPIO27 = .{ .name = "m2emf", .function = .ADC1 },
};
const pins = pin_conf.pins();
{ // Motor stuff
const PWM_WRAP = 1000;
const EMF_ARRAY_SIZE = 100;
const EMF_CUTOUT = 15;
pins.speed.slice().set_wrap(PWM_WRAP);
pins.speed.slice().enable();
// stop
pins.mot1.put(1);
pins.mot2.put(1);
std.log.debug("Motor stopped for {d} ms", .{1000});
pico.time.sleep_ms(1000);
// start
var level: usize = PWM_WRAP / 2;
while (level < PWM_WRAP) : (level += 50) {
pins.speed.set_level(@truncate(level));
pins.mot1.put(1);
pins.mot2.put(0);
pico.time.sleep_ms(2000);
{ // Measure Back-EMF
// Switch to free running mode
pins.mot1.put(0);
pins.mot2.put(0);
pico.time.sleep_us(100);
// Prepare ADC
pico.adc.select_input(pins.m1emf);
pico.adc.apply(.{
.sample_frequency = null,
.round_robin = null,
.temp_sensor_enabled = false,
.fifo = null,
}); // apply calls enable
// Actual measurring
pico.adc.start(.free_running);
var emfs: [EMF_ARRAY_SIZE]u12 = undefined;
for (0..EMF_ARRAY_SIZE) |i| {
emfs[i] = try pico.adc.read_result();
}
// preamble
for (0..10) |_| {
DDC.Test.sendOne();
// Measuring done, switch the motor back on
pico.adc.set_enabled(false);
pins.mot1.put(1);
pins.mot2.put(0);
// Sort results, so we can cut out the low and high part
std.sort.pdq(u12, &emfs, {}, less);
// Calculate average EMF
var sum: u16 = 0;
for (EMF_CUTOUT..EMF_ARRAY_SIZE - EMF_CUTOUT) |i| {
sum += emfs[i];
}
const m1emf = sum / (EMF_ARRAY_SIZE - 2 * EMF_CUTOUT);
std.log.debug("M1EMF: {d} -> {any}", .{ m1emf, emfs[15 .. emfs.len - 15] });
}
pico.time.sleep_ms(1000);
}
// pins.mot1.put(1);
// pins.mot2.put(0);
// pico.time.sleep_ms(5000);
// address
DDC.Test.sendByte(0b00110111);
DDC.Test.sendZero();
DDC.Test.sendByte(0b01110100);
DDC.Test.sendZero();
DDC.Test.sendByte(0b01000011);
DDC.Test.sendOne();
// { // DDC testing
// // preamble
// for (0..10) |_| {
// DDC.Test.sendOne();
// }
// DDC.Test.sendZero();
if (ddc.packets.readItem()) |packet| {
std.log.debug(
"packet address: {d} speed: {} instruction: {}",
.{ packet.address, packet.speed(), packet.instruction },
);
}
// // address
// DDC.Test.sendByte(0b00110111);
// DDC.Test.sendZero();
// DDC.Test.sendByte(0b01110100);
// DDC.Test.sendZero();
// DDC.Test.sendByte(0b01000011);
// DDC.Test.sendOne();
// if (ddc.packets.readItem()) |packet| {
// std.log.debug(
// "packet address: {d} speed: {} instruction: {}",
// .{ packet.address, packet.speed(), packet.instruction },
// );
// }
pico.multicore.fifo.write_blocking(12);
pico.time.sleep_ms(5000);
pico.multicore.fifo.write_blocking(20);
pico.time.sleep_ms(5000);
// pico.multicore.fifo.write_blocking(12);
// pico.time.sleep_ms(5000);
// pico.multicore.fifo.write_blocking(20);
// pico.time.sleep_ms(5000);
// }