void audioInit(void) { PMC_EnablePeripheral(ID_PWM); PWMC_ConfigureClocks(0, 0, BOARD_MCK); PWMC_ConfigureChannel(PWM, 0, PWM_CMR_CPRE_MCK, 0, 0); PWMC_ConfigureEventLineMode(PWM, 0, 1); audioSetSample(AUDIO_NULL, DEFAULT_AUDIO_SAMPLERATE); PWMC_EnableChannel(PWM, 0); PMC_EnablePeripheral(ID_DACC); DACC_Initialize(DACC, ID_DACC, 1, 4, 0, 0, BOARD_MCK, 8, DACC_CHANNEL_0, 0, 16 ); DACC_EnableChannel(DACC, DACC_CHANNEL_0); }
/** * \brief DAC initialization. */ void enc_init(void) { /* initialize amplitude and frequency */ amplitude = MAX_DIGITAL * 2 / 5; frequency = HIJACK_CARRIER_FREQ_CONF; /*10 us timer*/ SysTick_Config( BOARD_MCK / (frequency * SAMPLES) ) ; //_ConfigureTc0( HIJACK_CARRIER_FREQ_8KHZ ); //TC_Start( TC0, 0 ) ; /* Initialize DACC */ 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, 8, /* refresh period */ 0, /* Channel 0 selection */ 0, /* Tag Selection Mode disabled */ 16 /* value of the start up time */); /* enable NVIC_DACC. */ NVIC_EnableIRQ( DACC_IRQn ) ; NVIC_SetPriority(DACC_IRQn, 5); /* variable initial. */ enc.data = 0; enc.state = Waiting; enc.cur = SET; enc.factor = Div1; enc.reverse = 0; ticker = 0; index_sample = 0; /*Enable channel for potentiometer*/ DACC_EnableChannel( DACC, DACC_channel_sine ) ; /*initialize the DACC_CDR*/ DACC_SetConversionData( DACC,sine_data[90]*amplitude/(MAX_DIGITAL/2)+MAX_DIGITAL/2); DACC->DACC_IER = DACC_IER_EOC; //Enable DACC end-of-convertion interrupt }
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); }
/** * Configure the TC0 and DACC for audio output. * \param sampleRate Audio sample rate. * \param nbChannels Number of audio channels. * \param mck MCK frequence. */ static void ConfigureAudioPlay(uint32_t sampleRate, uint8_t nbChannels, uint32_t mck) { uint32_t div = 2; uint32_t tcclks = TC_CMR_TCCLKS_TIMER_CLOCK1; uint32_t freq = sampleRate * nbChannels; double ra, rc; /* Enable TC0 Peripheral */ PMC_EnablePeripheral(ID_TC0); { uint32_t divs[5] = {2, 8, 32, 128,BOARD_MCK / 32768}; uint8_t i = 0; divs[4] = mck/32768; /* Minimize DIV & Maxmize RC for better waveform */ while(freq < ((mck / divs[i]) / 65536)) { ++ i; if (i == 5) { TRACE_FATAL("Cann't find TC0 divisor!\n\r"); } } div = divs[i]; tcclks = i; } /* Configure TC for tioa output: 48M -> 48K*2 */ TC_Configure(TC0,0, tcclks /*MCK/2*/ | TC_CMR_ACPC_SET | TC_CMR_WAVE | TC_CMR_ACPA_CLEAR | TC_CMR_CPCTRG); /* 50% duty ,freq frequency*/ ra = (((double)mck/div)/(freq*2) + 0.5 ); rc = (((double)mck/div)/(freq) + 0.99); TC0->TC_CHANNEL[0].TC_RA = (uint32_t)ra; TC0->TC_CHANNEL[0].TC_RC = (uint32_t)ra*2; defaultRA = (uint32_t)ra; printf("-I- MCK %dKHz, Div %d(%x), RA: %d*.01(%x), RC: %d*.01(%x)\n\r", (int)mck/1000, (int)div, (unsigned int)div, (int)(ra*100), (int)ra, (int)(rc*100), (int)rc); /* Initialize DACC with HW as trigger */ DACC_Initialize( DACC, ID_DACC, 1, 1, 0, /* DACC_MR_WORD_HALF */ 0, BOARD_MCK, 8, CHANNEL_R, 1, 16); /* channel number is in the first 4 significant bits*/ DACC->DACC_MR |= DACC_MR_TAG; /* disable PDC for DAC */ DACC->DACC_PTCR = DACC_PTCR_TXTDIS; /* Mute */ AudioPlayEnable(0); /* Enable DACC ISR */ NVIC_EnableIRQ(DACC_IRQn); }