Paso 5: Código completo
#define _BV(x) (1 << (x));
sin768 de uint32_t [] PROGMEM = / * x = [0:5375]; y = 127+127*(sin(2*pi/5376)) * /
p_A uint32_t p_B, p_C, p_C2, p_C3; fase A fase valor de fase C B--aunque salida son 8bits, p_A y p_B valor será utilizado para generar un nuevo valor de 32 bits para cop con 32 bits salida PIOC
uint16_t phaseAInc, phaseBInc, phaseCInc, freq, freqNew; intervalo de uint32_t; uint16_t muestras, preestablecido; t de uint32_t = 0;
void setup() {}
URL de salida instalación PIOC: Arduino Due pin33-40 se emplea como fase A la salida al pin trabajo 44-51 para la salida de la fase B
PIOC -> PIO_PER = 0xFFFFFFFE; Controlador de PIO PIO habilitar registro (consulte p656 de ATMEL SAM3X hoja de datos) y http://arduino.cc/en/Hacking/PinMappingSAM3X, pin Arduino Due se habilitaron 33-41 y 44-51
PIOC -> PIO_OER = 0xFFFFFFFE; PIO control salida activar registro, consulte p657 de ATMEL SAM3X hoja de datos
PIOC -> PIO_OSR = 0xFFFFFFFE; Estado de la salida del controlador PIO registro, consulte p658 de ATMEL SAM3X hoja de datos
PIOC -> PIO_OWER = 0xFFFFFFFE; PIO salida escriba habilitar registro, consulte p670 de ATMEL SAM3X hoja de datos
PIOA -> PIO_PDR = 0x30000000; opcional como seguro, no parecen afectar al rendimiento, pin digital 10 Conecte a PC29 y PA28, pin digital 4 conectarse ambos PC29 y PA28, aquí para desactivar desactivar PIOA #28 y 29 de //timer de configuración, consulte el http://arduino.cc/en/Hacking/PinMappingSAM3X,
pmc_set_writeprotect(false); deshabilitar protección contra escritura de registros de Control de gestión de energía
pmc_enable_periph_clk(ID_TC7); activar el contador de tiempo de reloj periférico 7
TC_Configure (/ * reloj * / TC2, / * canal * / 1, TC_CMR_WAVE | TC_CMR_WAVSEL_UP_RC | TC_CMR_TCCLKS_TIMER_CLOCK1); TC del reloj 42MHz (reloj, canal, modo de comparar) TC_SetRC (TC2, 1, intervalo); TC_Start (TC2, 1);
habilitar interrupciones de temporizador del temporizador TC2 -> TC_CHANNEL [1]. TC_IER = TC_IER_CPCS; IER = interrupción habilitar registro TC2 -> TC_CHANNEL [1]. TC_IDR = ~ TC_IER_CPCS; IDR = registro de deshabilitar interrupciones
NVIC_EnableIRQ(TC7_IRQn); Habilitar la interrupción en el anidado vector interrupción regulador freq = 60; Inicialice la frecuencia como preajuste de 60Hz = 21; array, aumento del índice de 21 muestras = 256; intervalo de 256/ciclo de muestras de salida = 42000000/(freq*samples); interrupción cuenta TC_SetRC (TC2, 1, intervalo); iniciar Serial.begin(9600) de TC; para propósito de prueba}
void checkFreq()
{freqNew = 20000;
Si (freq == freqNew) {} else
{freq = freqNew;
Si (freq > 20000) {freq = 20000; / * máximo de frecuencia 20 kHz * /};
Si (freq < 1) {freq = 1; / * min frecuencia 1 Hz * /};
Si (freq > 999) {preset = 384; muestras = 14;} //for frecuencia > = 1kHz, 14 muestras para cada ciclo
else if (freq > 499) {preset = 84; muestras = 64;} //for 500 < = frecuencia < 1000Hz, 64 muestras para cada otro ciclo si (freq > 99) {preset = 42; muestras = 128;} //for 100Hz < = frecuencia < 500Hz, 128 muestras/ciclo
Else {preset = 21; muestras = 256;}; para frecuencia < 100hz, 256 muestras por ciclo
intervalo = 42000000/(freq*samples); t = 0; TC_SetRC (TC2, 1, intervalo); } }
void loop() {}
checkFreq(); Delay(100); }
void TC7_Handler(void)
{TC_GetStatus(TC2,1);
t = muestras de % t; t % muestras avoild desbordamiento de phaseAInc t = (preset * t) % 5376; utilizar % 5376 para evitar desbordamiento de índice de matriz
phaseBInc = (phaseAInc + 1792) % 5376;
phaseCInc = (phaseAInc + 3584) % 5376;
p_A = sin768 [phaseAInc] << 1; Consulte PIOC: PC1 al PC8, pin Arduino Due correspondiente: pin 33-40, por lo tanto cambio izquierda de 1 dígito
p_B = sin768 [phaseBInc] << 12; Consulte PIOC: PC12 a PC19, pin Arduino Due correspondiente: pin 51-44, por lo tanto cambio izquierda 12 dígitos
p_C = sin768 [phaseCInc]; fase C salida empleado PIOC: PC21 PC22, PC23, PC24, PC25, PC26, PC28 y PC29, pin Arduino Due correspondiente: pin digital: 9,8,7,6,5,4,3,10, respectivamente
p_C2 = (p_C & B11000000) << 22; Esto genera PC28 y PC29
p_C3 = (p_C & B00111111) << 21; Esto genera PC26 PC21 / / Serial.println(p_C3,BIN); p_C = p_C2|p_C3; Esto genera salida en paralelo de fase C
p_A = p_A|p_B|p_C; salida de 32 bits = fase A (8 bits) |phase B|phase C //Serial.println (p_A >> 21, BIN); PIOC -> PIO_ODSR = 0x37E00000;
PIOC -> PIO_ODSR = p_A; registro de salida = p_A t ++; }