void encoder_init(void) { PIO_Configure(&pin_encoder_a, 1); PIO_Configure(&pin_encoder_b, 1); // Enable peripheral clock for TC PMC->PMC_PCER0 = 1 << ID_TC0; // Configure and enable TC interrupts NVIC_DisableIRQ(TC0_IRQn); NVIC_ClearPendingIRQ(TC0_IRQn); NVIC_SetPriority(TC0_IRQn, PRIORITY_ENCODER_TC0); NVIC_EnableIRQ(TC0_IRQn); tc_channel_init(&ENCODER_TC_CHANNEL, TC_CMR_TCCLKS_TIMER_CLOCK4 | TC_CMR_CPCTRG); // Interrupt in compare tc_channel_interrupt_set(&ENCODER_TC_CHANNEL, TC_IER_CPCS); ENCODER_COUNTER = 25; }
void stepper_init(void) { Pin pins_stepper[] = {PINS_STEPPER}; PIO_Configure(pins_stepper, PIO_LISTSIZE(pins_stepper)); Pin stepper_power_management_pins[] = {VOLTAGE_STACK_PIN, VOLTAGE_EXTERN_PIN, VOLTAGE_STACK_SWITCH_PIN, STEPPER_CURRENT_PIN}; PIO_Configure(stepper_power_management_pins, PIO_LISTSIZE(stepper_power_management_pins)); // Initialize and enable DACC to set VREF and DECAY pins DACC_Initialize(DACC, ID_DACC, 0, // Hardware triggers are disabled 0, // External trigger 0, // Half-Word Transfer 0, // Normal Mode (not sleep mode) BOARD_MCK, 1, // refresh period 0, // Channel 0 selection 1, // Tag Selection Mode enabled 16); // value of the start up time DACC_EnableChannel(DACC, VREF_CHANNEL); DACC_EnableChannel(DACC, DECAY_CHANNEL); // Enable peripheral clock for TC PMC->PMC_PCER0 = 1 << ID_TC0; // Configure and enable TC interrupts NVIC_DisableIRQ(TC0_IRQn); NVIC_ClearPendingIRQ(TC0_IRQn); NVIC_SetPriority(TC0_IRQn, PRIORITY_STEPPER_TC0); NVIC_EnableIRQ(TC0_IRQn); tc_channel_init(&STEPPER_TC_CHANNEL, TC_CMR_TCCLKS_TIMER_CLOCK5 | TC_CMR_CPCTRG); // Interrupt in compare tc_channel_interrupt_set(&STEPPER_TC_CHANNEL, TC_IER_CPCS); PMC->PMC_PCER0 = 1 << ID_TC1; tc_channel_init(&SINGLE_SHOT_TC_CHANNEL, TC_CMR_WAVE | TC_CMR_TCCLKS_TIMER_CLOCK4 | TC_CMR_EEVT_XC0 | TC_CMR_ASWTRG_SET | TC_CMR_ACPC_CLEAR | TC_CMR_WAVSEL_UP | TC_CMR_CPCDIS | TC_CMR_CPCSTOP); SINGLE_SHOT_COUNTER = 1; tc_channel_start(&SINGLE_SHOT_TC_CHANNEL); stepper_set_output_current(VREF_DEFAULT_CURRENT); stepper_set_step_mode(STEP_MODE_EIGTH); stepper_set_decay(DECAY_DEFAULT_VALUE); adc_channel_enable(VOLTAGE_EXTERN_CHANNEL); adc_channel_enable(VOLTAGE_STACK_CHANNEL); adc_channel_enable(STEPPER_CURRENT_CHANNEL); }
void imu_leds_on(const bool on) { if(on) { PMC->PMC_PCER0 = 1 << ID_PWM; for(uint8_t i = 0; i < 4; i++) { PWMC_ConfigureChannel(PWM, i, PWM_CMR_CPRE_MCK, 0, 0); PWMC_SetPeriod(PWM, i, 0xFFFF); PWMC_SetDutyCycle(PWM, i, 0); PWMC_EnableChannel(PWM, i); } PMC->PMC_PCER0 = 1 << ID_TC0; tc_channel_init(&TC0->TC_CHANNEL[0], TC_CMR_WAVE | TC_CMR_TCCLKS_TIMER_CLOCK1 | TC_CMR_ACPA_CLEAR | TC_CMR_ACPC_SET | TC_CMR_WAVSEL_UP_RC); TC0->TC_CHANNEL[0].TC_RA = 0; TC0->TC_CHANNEL[0].TC_RC = 0xFFFF; tc_channel_start(&TC0->TC_CHANNEL[0]); PMC->PMC_PCER0 = 1 << ID_TC1; tc_channel_init(&TC0->TC_CHANNEL[1], TC_CMR_WAVE | TC_CMR_TCCLKS_TIMER_CLOCK1 | TC_CMR_ACPA_CLEAR | TC_CMR_ACPC_SET | TC_CMR_WAVSEL_UP_RC); TC0->TC_CHANNEL[1].TC_RA = 0; TC0->TC_CHANNEL[1].TC_RC = 0xFFFF; tc_channel_start(&TC0->TC_CHANNEL[1]); PMC->PMC_PCER0 = 1 << ID_TC2; tc_channel_init(&TC0->TC_CHANNEL[2], TC_CMR_WAVE | TC_CMR_TCCLKS_TIMER_CLOCK1 | TC_CMR_BCPB_CLEAR | TC_CMR_BCPC_SET | TC_CMR_EEVT_XC0 | TC_CMR_WAVSEL_UP_RC); TC0->TC_CHANNEL[2].TC_RB = 0; TC0->TC_CHANNEL[2].TC_RC = 0xFFFF; tc_channel_start(&TC0->TC_CHANNEL[2]); PIO_Configure(pins_imu_led, PIO_LISTSIZE(pins_imu_led)); } else { PMC->PMC_PCER0 &= ~(1 << ID_PWM); PMC->PMC_PCER0 &= ~(1 << ID_TC0); PMC->PMC_PCER0 &= ~(1 << ID_TC1); PMC->PMC_PCER0 &= ~(1 << ID_TC2); Pin pins[] = {PINS_IMU_LED}; for(uint8_t i = 0; i < PIO_LISTSIZE(pins); i++) { pins[i].type = PIO_OUTPUT_1; } PIO_Configure(pins, PIO_LISTSIZE(pins)); } imu_use_leds = on; }