Агуулгын хүснэгт:
- Алхам 1: Синус өгөгдлийн массив үүсгэх
- Алхам 2: Зэрэгцээ гаралтыг идэвхжүүлэх
- Алхам 3: Тасалдлыг идэвхжүүлэх
- Алхам 4: R/2R DAC
- Алхам 5: Бүрэн код
Видео: Arduino Due дээр суурилсан 3 фазын синус долгионы үүсгүүр: 5 алхам
2024 Зохиолч: John Day | [email protected]. Хамгийн сүүлд өөрчлөгдсөн: 2024-01-30 11:03
Энэхүү хуваалцах зорилго нь 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 ++; }
Зөвлөмж болгож буй:
Цэвэр синус долгионы хувиргагч: 8 алхам
Цэвэр синус долгионы инвертер: Миний судалгаа
Синус долгионы хяналтын самбар үйлдвэрлэх: 5 алхам
Синус долгионы хяналтын самбар үйлдвэрлэх: Энэ удаад нэг фазын синус долгионтой сүлжээний хяналтын самбар, дараа нь нэг фазын синус долгионы сүлжээнээс гадуурх хяналтын самбар, дараа нь гурван фазын синус долгионы сүлжээнээс гадуурх хяналтын самбар, эцэст нь гурван фазын синус долгионы сүлжээнээс гадуурх хяналтын самбар. Бид найдаж байна
Arduino долгионы үүсгүүр: 5 алхам (зурагтай)
Arduino Waveform Generator: 2021 оны 2 -р сарын шинэчлэлт: Raspberry Pi Pico дээр суурилсан түүвэрлэлтийн хурдыг 300 дахин нэмэгдүүлсэн шинэ хувилбарыг шалгаарай. Лабораторид ихэвчлэн тодорхой давтамж, хэлбэр, далайцын давтагдах дохио хэрэгтэй болдог. Энэ нь өсгөгчийг турших, хэлхээг шалгах
Raspberry Pi эсвэл бусад Linux / unix дээр суурилсан компьютер дээр дэлгэцгүй / дэлгэцгүй (толгойгүй) ажиллуулах: 6 алхам
Raspberry Pi эсвэл бусад Linux / unix дээр суурилсан компьютер дээр дэлгэцгүй / дэлгэцгүй (толгойгүй) ажиллуулах: Ихэнх хүмүүс Raspberry PI худалдаж авахдаа компьютерийн дэлгэц хэрэгтэй гэж боддог. Компьютерийн шаардлагагүй дэлгэц, гар дээр мөнгөө бүү үр. Компьютер хооронд гар, дэлгэц шилжүүлэхэд цагаа дэмий үрэх хэрэггүй. Үгүй бол ТВ битгий уя
Arduino дээр суурилсан контактгүй хэт улаан туяаны термометр - Arduino ашиглан IR суурилсан термометр: 4 алхам
Arduino дээр суурилсан контактгүй хэт улаан туяаны термометр | Arduino ашиглан IR суурилсан термометр: Сайн байна уу залуусаа энэ зааварчилгаанд бид arduino ашиглан контактгүй термометр хийх болно. Заримдаа шингэн/хатуу бодисын температур хэт өндөр эсвэл бага байдаг тул түүнтэй холбоо тогтооход хэцүү байдаг. тэр үед температур