Агуулгын хүснэгт:

Arduino Due дээр суурилсан 3 фазын синус долгионы үүсгүүр: 5 алхам
Arduino Due дээр суурилсан 3 фазын синус долгионы үүсгүүр: 5 алхам

Видео: Arduino Due дээр суурилсан 3 фазын синус долгионы үүсгүүр: 5 алхам

Видео: Arduino Due дээр суурилсан 3 фазын синус долгионы үүсгүүр: 5 алхам
Видео: Прямой запуск инверторного компрессора холодильника и тестирование UVW 2024, Долдугаар сарын
Anonim
Arduino Due дээр суурилсан 3 фазын синус долгионы үүсгүүр
Arduino Due дээр суурилсан 3 фазын синус долгионы үүсгүүр

Энэхүү хуваалцах зорилго нь Due-ийн илүү өндөр гүйцэтгэл + лавлагаа дутмаг + ашиггүй мэдээллийн хүснэгтийг ашиглахыг оролдож буй хүнд туслах явдал юм.

Энэхүү төсөл нь бага давтамжтай (<1 кГц) 3 фазын синус долгион @ 256 дээж / мөчлөг, өндөр давтамжтай (20 кГц хүртэл) 16 дээж / мөчлөг үүсгэх боломжтой бөгөөд энэ нь энгийн LPF ба гаралт бараг төгс болсон.

хавсаргасан файл нь миний эцсийн хувилбар биш байсан тул би нэмэлт шинж чанар нэмж оруулсан боловч гол нь үүнтэй ижил байна. Дээж/мөчлөгийг дээрх мэдэгдлээс доогуур тавьсан болохыг анхаарна уу.

хавсаргасан файлд үзүүлсэн арга замаар CPU -ийн хүчин чадлыг дээд зэргээр нэмэгдүүлэх тул би Arduino Due -ийн давтамжийн утгыг дамжуулахын тулд Arduino Due -ийн гадаад тасалдлыг ашигладаг хяналтын нэгж болгон Arduino Uno -ийг ашигласан. Давтамжийн хяналтаас гадна Arduino Uno нь далайцыг (дижитал потенциал хэмжигч + OpAmp-ээр) хянах, I/O --- тоглох маш их өрөөтэй болно.

Алхам 1: Синус өгөгдлийн массив үүсгэх

Бодит цагийн тооцоолол нь CPU шаарддаг тул илүү сайн ажиллахын тулд синус өгөгдлийн массив шаардлагатай болно

uint32_t sin768 PROGMEM =…. байхад x = [0: 5375]; y = 127+127*(нүгэл (2*pi/5376/*эсвэл таны хүссэн # # шаардлагаас хамаарна)/)

Алхам 2: Зэрэгцээ гаралтыг идэвхжүүлэх

Uno -ээс ялгаатай нь Due нь цөөн тооны лавлагаатай байдаг. Гэсэн хэдий ч Arduino Uno дээр суурилсан 3 фазын синус долгион үүсгэхийн тулд 1 -рт, MCLK багатай (16 МГц, 84 МГц байх ёстой), 2 -рт гүйцэтгэл нь алга ташилт биш юм. 3-р үеийг үйлдвэрлэх аналог хэлхээ (C = -AB).

GPIO -ийг идэвхжүүлэх нь ихэвчлэн SAM3X -ийн өгөгдлийн хүснэгтэд ашиглагдаагүй туршилт дээр суурилсан болно

PIOC-> PIO_PER = 0xFFFFFFFE; // PIO хянагч PIO Идэвхжүүлэх бүртгэл (ATMEL SAM3X мэдээллийн хуудасны p656-г үзнэ үү) ба https://arduino.cc/en/Hacking/PinMappingSAM3X, Arduino Due pin 33-41 ба 44-51 идэвхжсэн байна.

PIOC-> PIO_OER = 0xFFFFFFFE; // PIO хянагчийн гаралтын бүртгэлийг идэвхжүүлэх, ATMEL SAM3X мэдээллийн хуудасны p657-ийг үзнэ үү PIOC-> PIO_OSR = 0xFFFFFFFE; // PIO хянагчийн гаралтын байдлын бүртгэл, ATMEL SAM3X мэдээллийн хүснэгтийн p658 -ийг үзнэ үү

PIOC-> PIO_OWER = 0xFFFFFFFE; // PIO гаралтын бичих идэвхжүүлэх бүртгэл, ATMEL SAM3X мэдээллийн хүснэгтийн p670 -ийг үзнэ үү

// PIOA-> PIO_PDR = 0x30000000; // даатгалын хувьд заавал биш, гүйцэтгэлд нөлөөлдөггүй, дижитал зүү 10 нь PC29 ба PA28 хоёуланд нь холбогддог, дижитал зүү 4 нь PC29 ба PA28 -д холбогддог, энд PIOA #28 & 29 -ийг идэвхгүй болгох боломжтой.

Алхам 3: Тасалдлыг идэвхжүүлэх

Гүйцэтгэлийг нэмэгдүүлэхийн тулд CPU -ийн ачаалал аль болох бага байх ёстой. Гэсэн хэдий ч CPU-ийн зүү ба Due зүү хооронд 1to1 харьцаагүй тул битийн ажиллагаа шаардлагатай болно.

Та алгоритмыг оновчтой болгох боломжтой боловч өрөө маш хязгаарлагдмал байдаг.

хүчингүй TC7_Handler (хүчингүй) {TC_GetStatus (TC2, 1);

t = t%дээж; // t -ээс хэтрэхгүй байхын тулд 'if' оронд t%дээжийг ашиглана уу

PhaseAInc = (урьдчилан тохируулсан*t)%5376; // массивын индекс хэт халахаас сэргийлэхийн тулд %5376 ашиглана уу

PhaseBInc = (PhaseAInc+1792)%5376;

PhaseCInc = (PhaseAInc+3584)%5376;

p_A = sin768 [PhaseAInc] << 1; // PIOC: PC1-ээс PC8-ийг үзнэ үү, харгалзах Arduino Due pin: pin 33-40, ингэснээр зүүн тийш 1 оронтой шилжинэ

p_B = sin768 [PhaseBInc] << 12; // PIOC: PC12-ээс PC19-ийг үзнэ үү, харгалзах Arduino Due pin: pin 51-44, ингэснээр зүүн тийш 12 оронтой шилжинэ

p_C = sin768 [фазCInc]; // C үе шатны гаралт PIOC: PC21, PC22, PC23, PC24, PC25, PC26, PC28 ба PC29, харгалзах Arduino Due pin: дижитал зүү: 9, 8, 7, 6, 5, 4, 3, 10 тус тус

p_C2 = (p_C & B11000000) << 22; // энэ нь PC28 ба PC29 -ийг үүсгэдэг

p_C3 = (p_C & B00111111) << 21; // энэ нь PC21-PC26 үүсгэдэг

p_C = p_C2 | p_C3; // энэ нь C фазын зэрэгцээ гаралтыг бий болгодог

p_A = p_A | p_B | p_C; // 32 битийн гаралт = А үе (8 бит) | Б үе шат | С үе

PIOC-> PIO_ODSR = p_A; // гаралтын бүртгэл = p_A

t ++; }

Алхам 4: R/2R DAC

3x8bit R/2R DAC -ийг бүтээгээрэй, google дээр ачаалал ихтэй.

Алхам 5: Бүрэн код

#тодорхойлох _BV (x) (1 << (x)); uint32_t sin768 PROGMEM = /* x = [0: 5375]; y = 127+127*(нүгэл (2*pi/5376))*/

uint32_t p_A, p_B, p_C, p_C2, p_C3; // үе шат А үе шат В фазын C утга-гаралт нь зөвхөн 8 бит боловч p_A ба p_B утгыг ашиглан 32 битийн PIOC гаралтыг даван туулахын тулд шинэ 32 битийн утга үүсгэх болно.

uint16_t PhaseAInc, PhaseBInc, PhaseCInc, freq, freqNew; uint32_t интервал; uint16_t дээж, урьдчилан тохируулсан; uint32_t t = 0;

хүчингүй тохиргоо () {

// зэрэгцээ гаралтын PIOC тохиргоо: Arduino Due pin33-40 нь А фазын гаралт, 44-51 зүү нь В гаралтын хувьд ажилладаг

PIOC-> PIO_PER = 0xFFFFFFFE; // PIO хянагч PIO Идэвхжүүлэх бүртгэл (ATMEL SAM3X мэдээллийн хуудасны p656-г үзнэ үү) ба https://arduino.cc/en/Hacking/PinMappingSAM3X, Arduino Due pin 33-41 ба 44-51 идэвхжсэн байна.

PIOC-> PIO_OER = 0xFFFFFFFE; // PIO хянагчийн гаралтын бүртгэлийг идэвхжүүлэх, ATMEL SAM3X мэдээллийн хүснэгтийн p657 -ийг үзнэ үү

PIOC-> PIO_OSR = 0xFFFFFFFE; // PIO хянагчийн гаралтын байдлын бүртгэл, ATMEL SAM3X мэдээллийн хүснэгтийн p658 -ийг үзнэ үү

PIOC-> PIO_OWER = 0xFFFFFFFE; // PIO гаралтын бичих идэвхжүүлэх бүртгэл, ATMEL SAM3X мэдээллийн хүснэгтийн p670 -ийг үзнэ үү

// PIOA-> PIO_PDR = 0x30000000; // даатгалын хувьд заавал биш, гүйцэтгэлд нөлөөлдөггүй, дижитал зүү 10 нь PC29 ба PA28 хоёуланд нь холбогддог, дижитал зүү 4 нь PC29 ба PA28 -д холбогддог, энд PIOA #28 & 29 -ийг идэвхгүй болгохын тулд // таймерын тохиргоог идэвхгүй болгохын тулд https://arduino.cc/en/Hacking/PinMappingSAM3X, pmc_set_writeprotect (худал); // Эрчим хүчний удирдлагын хяналтын бүртгэлийн бичих хамгаалалтыг идэвхгүй болгох

pmc_enable_periph_clk (ID_TC7); // захын цагийн тоолуурыг идэвхжүүлэх 7

TC_Configure (/ * цаг */TC2,/ * суваг */1, TC_CMR_WAVE | TC_CMR_WAVSEL_UP_RC | TC_CMR_TCCLKS_TIMER_CLOCK1); // TC цаг 42MHz (цаг, суваг, харьцуулах горимын тохиргоо) TC_SetRC (TC2, 1, интервал); TC_Start (TC2, 1);

// таймер дээр тасалдал идэвхжүүлэх TC2-> TC_CHANNEL [1]. TC_IER = TC_IER_CPCS; // IER = тасалдлыг идэвхжүүлэх бүртгэл TC2-> TC_CHANNEL [1]. TC_IDR = ~ TC_IER_CPCS; // IDR = бүртгэлийг таслах

NVIC_EnableIRQ (TC7_IRQn); // үүрлэсэн вектор тасалдлын хянагч дахь тасалдлыг идэвхжүүлэх freq = 60; // давтамжийг 60 Гц -ийн урьдчилсан тохиргоо = 21 болгон эхлүүлэх; // массивын индекс 21 дээжээр нэмэгдсэн = 256; // гаралтын дээж 256/мөчлөгийн интервал = 42000000/(давтамж*дээж); // тасалдал тоолох TC_SetRC (TC2, 1, интервал); // эхлэх TC Serial.begin (9600); // туршилтын зорилгоор}

void checkFreq ()

{freqNew = 20000;

if (freq == freqNew) {} өөр

{freq = freqNew;

if (давтамж> 20000) {давтамж = 20000; /*хамгийн их давтамж 20 кГц*/};

хэрэв (давтамж <1) {давтамж = 1; /*мин давтамж 1Гц*/};

if (давтамж> 999) {урьдчилан тохируулсан = 384; дээж = 14;} // давтамжийн хувьд> = 1кГц, мөчлөг бүрт 14 дээж

if if (freq> 499) {preset = 84; дээж = 64;} // 500 -ийн хувьд <= давтамж99) {урьдчилан тохируулсан = 42; дээж = 128;} // 100 Гц -ийн хувьд <= давтамж <500 Гц, 128 дээж/мөчлөг

өөр {урьдчилан тохируулсан = 21; дээж = 256;}; // 100 гц давтамжтай, мөчлөг бүрт 256 дээж

интервал = 42000000/(давтамж*дээж); t = 0; TC_SetRC (TC2, 1, интервал); }}

void loop () {

checkFreq (); саатал (100); }

хүчингүй TC7_Handler (хүчингүй)

{TC_GetStatus (TC2, 1);

t = t%дээж; // t fazAInc = (урьдчилан тохируулсан*t)%5376 хэт халалтаас сэргийлэхийн тулд t%дээжийг ашиглана уу; // массивын индексийг халихаас сэргийлэхийн тулд %5376 ашиглана уу

PhaseBInc = (PhaseAInc+1792)%5376;

PhaseCInc = (PhaseAInc+3584)%5376;

p_A = sin768 [PhaseAInc] << 1; // PIOC: PC1-ээс PC8-ийг үзнэ үү, харгалзах Arduino Due pin: pin 33-40, ингэснээр зүүн тийш 1 оронтой шилжинэ

p_B = sin768 [PhaseBInc] << 12; // PIOC: PC12-ээс PC19-ийг үзнэ үү, харгалзах Arduino Due pin: pin 51-44, ингэснээр зүүн тийш 12 оронтой шилжинэ

p_C = sin768 [фазCInc]; // C үе шатны гаралт PIOC: PC21, PC22, PC23, PC24, PC25, PC26, PC28 ба PC29, харгалзах Arduino Due pin: тоон зүү: 9, 8, 7, 6, 5, 4, 3, 10 тус тус

p_C2 = (p_C & B11000000) << 22; // энэ нь PC28 ба PC29 -ийг үүсгэдэг

p_C3 = (p_C & B00111111) << 21; // энэ нь PC21-PC26 //Serial.println(p_C3, BIN) үүсгэдэг; p_C = p_C2 | p_C3; // энэ нь C фазын зэрэгцээ гаралтыг бий болгодог

p_A = p_A | p_B | p_C; // 32 битийн гаралт = А үе (8 бит) | үе шат В | С үе шат // Цуврал.println(p_A>>21, BIN); // PIOC-> PIO_ODSR = 0x37E00000;

PIOC-> PIO_ODSR = p_A; // гаралтын бүртгэл = p_A t ++; }

Зөвлөмж болгож буй: