コード例 #1
0
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;
}
コード例 #2
0
ファイル: stepper.c プロジェクト: Nic2012/stepper-brick
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);
}
コード例 #3
0
ファイル: imu.c プロジェクト: makerpc/imu-v2-brick
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;
}