คำอธิบาย ADDC คำอธิบายของโปรโตคอล ADC
ไมโครคอนโทรลเลอร์ STM32 มีโมดูล ADC อันทรงพลังซึ่งมีประสิทธิภาพที่ดีและคุณสมบัติที่น่าสนใจ:
- ช่องสัญญาณเข้า 18 ช่อง (ภายนอก 16 ช่อง และภายใน 2 ช่อง)
- ความละเอียด 12 บิต
- โหมดการแปลงต่างๆ:
- ครั้งหนึ่ง
- อย่างต่อเนื่อง
- โดยทริกเกอร์
- โดยจับเวลา
- การจัดตำแหน่งบิตผลลัพธ์ที่สะดวก
- แน่นอนว่าสร้างการขัดจังหวะและสัญญาณทุกประเภทสำหรับ DMA
- ความเร็วการแปลงเป็นดิจิทัล - สูงสุด 0.9 MSPS พร้อมการบันทึกและเวลาในการแปลงที่ตั้งโปรแกรมได้
- การสอบเทียบอัตโนมัติ
- โหมดการสแกนรายการอินพุต
- สุนัขเฝ้าบ้านแบบอะนาล็อก
ความต้องการโมดูลนี้เกิดขึ้นบ่อยครั้ง เพียงเพราะธรรมชาติรอบตัวเราไม่ได้แยกจากกัน แต่ต่อเนื่อง และเซ็นเซอร์ทุกชนิดมักจะสร้างสัญญาณอะนาล็อก นี่เป็นเรื่องจริงโดยเฉพาะอย่างยิ่งสำหรับเสียง แต่ก็สามารถทำได้เช่นกัน ตัวอย่างเช่น ออสซิลโลสโคป: ออสซิลโลสโคป USB จีนยอดนิยม DSO Nano ผลิตขึ้นโดยเฉพาะบน STM32F103
โครงสร้างภายใน
การวัดและแรงดันอ้างอิง
หลักการของการแปลงเป็นดิจิทัลนั้นง่ายมาก: เปรียบเทียบแรงดันไฟฟ้าอินพุตกับแรงดันไฟฟ้าอ้างอิง V_REF- และ V_REF+:
- V_REF - ต้องเชื่อมต่อกับกราวด์
- ตัวเลือก V_REF+: ไปยังแหล่งจ่ายไฟของโปรเซสเซอร์ (ลอยอยู่และมีเสียงดัง ดังนั้นตัวเลือกนี้จึงเหมาะสำหรับการวัดที่ไม่ถูกต้องเท่านั้น) หรือไปยังแหล่งจ่ายแรงดันอ้างอิงภายนอก (REV)
อย่างไรก็ตาม คุณสามารถกำหนดค่าขาเหล่านี้โดยทางโปรแกรมสำหรับการเชื่อมต่อโดยตรงกับกราวด์และกำลังไฟได้
แรงดันไฟฟ้าอินพุต V_In จะถูกวัดโดยสัมพันธ์กับ V_REF- และ V_REF+ และผลลัพธ์ของการแปลงจะถูกเพิ่มลงในรีจิสเตอร์เอาต์พุตตามสัดส่วนต่อไปนี้:
ตัวอย่างเช่น 1.2 V เมื่อเปิดเครื่อง ADC จาก 3.3 V จะถูกแปลงเป็น 1490
ADC ลงทะเบียนใน STM32
SR - การลงทะเบียนสถานะ
บิต 0: แฟล็ก AWD (Analog WatchDog) สัญญาณอินพุตข้ามค่าของการลงทะเบียน LTR หรือ HTR
1 บิต: ธง EOC (สิ้นสุดการแปลง) หลังจากการแปลงเสร็จสิ้น ให้สลับไปที่ 1 รีเซ็ตด้วยตนเองหรือเมื่ออ่าน DR register
บิต 4: ธง STRT (เริ่ม) ส่งสัญญาณการเริ่มต้นของการแปลง
CR1 - การลงทะเบียนการตั้งค่าครั้งแรก
0..4 บิต: ค่า AWDCH (Analog WatchDog Channel) ตั้งค่าหมายเลขช่องสำหรับการติดตามโดย Watchdog
5 บิต: EOCIE (สิ้นสุดการเปิดใช้งานการขัดจังหวะการแปลง) เปิดใช้งานการขัดจังหวะเมื่อสิ้นสุดการแปลง
6 บิต: AWDIE (เปิดใช้งานการขัดจังหวะ WatchDog แบบอะนาล็อก) เปิดใช้งานการขัดจังหวะจ้องจับผิดแบบอะนาล็อก
7 บิต: เจโอซี
8 บิต: สแกน เปิดใช้งานโหมดการสแกนช่องตามรายการในรีจิสเตอร์ SQR1, SQR2, SQR3
9 บิต: AWDSGL (Analog WatchDog Single) ตั้งค่าประเภทของ Watchdog ที่ทริกเกอร์ในโหมด SCAN: สำหรับหนึ่งช่อง (1) หรือสำหรับทั้งหมด (0)
10 บิต: JAUTO
11 บิต: DISCEN (เปิดใช้งานโหมดไม่ต่อเนื่อง) เปิดใช้งานโหมดการทำงาน "ขาด" - ADC ถูกเปิดใช้งานโดยทริกเกอร์ภายนอก
12 บิต: JDISCEN
13..15 บิต: DISCNUM (จำนวนช่องโหมดไม่ต่อเนื่อง) จำนวนช่องสำหรับการแปลงในโหมด "ฉีกขาด"
16..19 บิต: DUALMOD (การเลือกโหมดคู่) ตั้งค่าโหมดการทำงานร่วมกันของ ADC สองตัว
22 บิต: Jawden
23 บิต: AWDEN (เปิดใช้งาน WatchDog แบบอะนาล็อก) รวมถึงสุนัขเฝ้าบ้านแบบอะนาล็อก
CR2 - การลงทะเบียนการตั้งค่าที่สอง
0 บิต: ADON (เปิด/ปิดตัวแปลงอนาล็อก/ดิจิทัล) เปิดใช้งาน ADC
1 บิต: CONT (ครอบคลุมอย่างต่อเนื่อง) เปิดใช้งานโหมดการวัดเดี่ยว (0) หรือแบบวนซ้ำ (1)
บิต 2: CAL (การสอบเทียบ) การตั้งค่าเป็น 1 เปิดใช้งานการปรับเทียบ; หลังจากการสอบเทียบเสร็จสิ้น ระบบจะรีเซ็ตเป็น 0 ก่อนอื่นคุณต้องรีเซ็ตรีจิสเตอร์
บิต 3: RSTCAL (รีเซ็ตการปรับเทียบ) การรีเซ็ตการลงทะเบียนการสอบเทียบให้ตั้งค่าเป็น 1 ในลักษณะเดียวกันแล้วรอการรีเซ็ต
8 บิต: DMA เปิดใช้งาน DMA
11 บิต: จัดตำแหน่ง จัดข้อมูลชิดขอบด้านขวา (0) หรือด้านซ้าย (1) ของเคส
12..14 บิต: JEXTSEL
15 บิต: JEXTTRIG
17..19 บิต: EXTSEL (เลือกเหตุการณ์ภายนอก) กำหนดหมายเลขเหตุการณ์ที่จะทริกเกอร์ (TIM1 CC1, TIM1 CC2, TIM1 CC3, TIM1 CC4, TIM3 TRGO, TIM4 CC4, EXTI_11, SWSTART)
20 บิต: EXTTRIG (ทริกเกอร์ภายนอก) เปิดใช้งาน Conversion ที่จะทริกเกอร์โดยทริกเกอร์ภายนอก
21 บิต: JSWSTART
22 บิต: SWSTART (เริ่มการแปลง) เริ่มการเปลี่ยนแปลง เสร็จแล้วก็รีเซ็ต
23 บิต: TSVREFE (เซ็นเซอร์อุณหภูมิและเปิดใช้งาน V_REF) รวมถึงเซ็นเซอร์อุณหภูมิและ ION ภายใน
DR - การลงทะเบียนผลการวัด
SMPR1, SMPR2 - เวลาการแปลง
บันทึกการตั้งค่าเวลาการแปลงสำหรับแต่ละช่อง
HTR และ LTR - ขีดจำกัดของสุนัขเฝ้าบ้าน
ขีดจำกัดบนและล่างสำหรับหน่วยเฝ้าระวังแบบอะนาล็อกจะคล้ายกับรีจิสเตอร์ DR
SQR1, SQR2, SQR3 - รายการช่องที่จะสแกน
โหมดสแกน (บิตสแกนในรีจิสเตอร์ CR1)
แบบฝึกหัด: เปิด ADC
กรณีที่ง่ายที่สุดของการใช้ ADC: ไม่มีการหยุดชะงัก โดยไม่มีโหมดที่ซับซ้อนใดๆ เราเพียงแค่นำไปใช้และวัดเป็นรอบ
การเริ่มต้น
- เปิดการตอกบัตรของโมดูล ADC
- การกำหนดค่าพารามิเตอร์โมดูล
- เปิดโมดูล ADC
- การกำหนดค่าอินพุต (หมายเลขช่อง ADC)
- เราดำเนินการสอบเทียบ
ฉันคิดว่าขาคริสตัลไม่ได้รับการกำหนดค่า กล่าวคือ ขาเหล่านั้นอยู่ในสถานะ "อินพุตแบบอะนาล็อก" เริ่มต้น นี่คือระบอบการปกครองที่เราต้องการ
มีเพียงขา STM32 บางตัวเท่านั้นที่สามารถทำงานเป็นอินพุต ADC ได้ โดยถูกกำหนดโดยสัญลักษณ์ ANx (x = 0..15 รูปนี้คือหมายเลขช่อง) สะดวกในการประมาณค่านี้ในโปรแกรม STM32Cube
เป็นโมฆะ adc_init() ( RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); // การตั้งค่า ADC ADC_InitTypeDef ADC_InitStructure; ADC_StructInit(&ADC_InitStructure); ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; // โหมดการทำงาน - ADC_InitStructure เดี่ยวและอิสระ ADC_ScanConvMode = DISABLE; // อย่าสแกนช่องสัญญาณ เพียงวัดหนึ่งช่องสัญญาณ ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; // การวัดครั้งเดียว ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // โดยไม่มีทริกเกอร์ภายนอก ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; // ผลการจัดตำแหน่งบิต - กดไปทางขวา ADC_InitStructure.ADC _ NbrOfChannel = 1; // จำนวนช่อง - ADC_Init หนึ่งชิ้น (ADC1, & ADC_InitStructure); // การกำหนดค่าช่อง ADC_RegularChannelConfig (ADC1, ADC_Channel_8, 1, ADC_SampleTime_55Cycles5); ในขณะที่ (ADC_GetCalibrationStatus(ADC1)); -
หลังจากใช้งานฟังก์ชันนี้แล้ว ADC1 จะได้รับการกำหนดค่า ปรับเทียบ และพร้อมสำหรับการวัดบนช่องสัญญาณที่ 8
การวัด
การวัดนั้นง่าย:
- เริ่มต้นการเปลี่ยนแปลง
- เรากำลังรอการสิ้นสุดของการแปลงเป็นดิจิทัล (ตรวจสอบธง EOC = สิ้นสุดการแปลง)
- การอ่านผลลัพธ์จากการลงทะเบียน DR
การใช้ฟังก์ชันเหล่านี้ที่ง่ายที่สุดคือ:
โมฆะ main() ( adc_init(); uint16_t value = 0; while(1) value = get_adc_value(); )
คุณสามารถรันโปรแกรม หยุดมันด้วยเบรกพอยต์ และอ่านค่าที่วัดได้ในดีบักเกอร์
ยอดดูโพสต์: 309
ADC เป็นโปรโตคอลแบบข้อความสำหรับเครือข่ายไคลเอนต์-เซิร์ฟเวอร์ คล้ายกับ Neo-Modus" Direct Connect (NMDC) เป้าหมายคือการสร้างโปรโตคอลแบบง่ายที่ไม่สร้างภาระให้กับไคลเอนต์หรือเซิร์ฟเวอร์ และสามารถขยายได้ จะแก้ไขวิธีแก้ปัญหาที่ไม่ดีของโปรโตคอล NMDC แต่ไม่ใช่ทั้งหมด
พิจารณาการโต้ตอบเดียวกัน: ไคลเอนต์ - ไคลเอนต์และไคลเอนต์ - เซิร์ฟเวอร์ เอกสารนี้แบ่งออกเป็นสองส่วน ส่วนแรกอธิบายโครงสร้างของโปรโตคอล ส่วนที่สองอธิบายความจำเพาะของระบบโปรโตคอลสำหรับการใช้โครงสร้างนี้ Advanced Direct Connect เป็นเวอร์ชันแรกและจะค่อยๆ ปรับปรุง
แนวคิดส่วนใหญ่สำหรับโปรโตคอลมาจากโครงการ DCTNG (ของ Jan Vidar Krey) ผู้เข้าร่วมหลักในการพัฒนา: Dustin Brody, Walter Doekes, Timmo Stange, Fredrik Ullner, Fredrik Stenberg และคนอื่นๆ มีส่วนสนับสนุนในฐานะผู้สร้าง โปรโตคอล NMDC
ข้อดีของโปรโตคอล
- SID เช่นเดียวกับชื่อของคำสั่งโปรโตคอล ประกอบด้วยอักขระละตินสี่ตัวเป็นตัวพิมพ์ใหญ่ โปรโตคอลนี้ค่อนข้างเหมาะสมสำหรับการนำไปใช้ในภาษา SI ตามมาตรฐานภาษา SI นั้น sizeof(char) == 1 นั่นคือ 4 อักขระจะใช้พื้นที่ 4 ไบต์ หรือสามารถแสดงเป็นจำนวนเต็มสี่ไบต์ได้ การแปลงสตริงเป็นตัวเลขและย้อนกลับช่วยลดความยุ่งยากและเพิ่มประสิทธิภาพการทำงานกับคำสั่งอย่างมาก และทำให้สามารถจัดเก็บคำสั่งแบบสหภาพได้
ข้อเสียของโปรโตคอล
- ตัวคั่นโปรโตคอลเป็นอักขระทั่วไป (ช่องว่างและยัติภังค์) ที่ต้องแทนที่ด้วย \s และ \n เนื่องจากอักขระเหล่านี้พบได้ทั่วไปในข้อความแชท จำนวนการแทนที่จึงมีมากเสมอ ซึ่งไม่เป็นเช่นนั้นในโปรโตคอล NMDC
- เมื่อเปรียบเทียบกับโปรโตคอล NMDC โปรโตคอล ADC มีความสามารถในการลบเมนูเฉพาะใน UserCommand อย่างไรก็ตาม ยังไม่มีตัวเลือกให้ลบเมนูใดเมนูหนึ่ง ในบริบทบางอย่าง.
ประวัติเวอร์ชัน
สามารถรับเอกสารเวอร์ชันต่อๆ ไป รวมถึงเวอร์ชันกลางและเก่ากว่าได้จาก: . เวอร์ชันนี้ถูกส่งเพื่อการแก้ไข:
เวอร์ชัน 1.0.1, 02-05-2008
- ส่วนขยายจะถูกเน้นไว้ในเอกสารแยกต่างหาก
- ข้อมูลจำเพาะจะถูกแยกออกเป็นโครงการแยกต่างหากบน SourceForge
เวอร์ชัน 1.0, 01-12-2550
- การเปิดตัวครั้งแรก
โครงสร้างโปรโตคอล
- คำสั่งโปรโตคอลทั้งหมดเริ่มต้นด้วยตัวอักษรสี่ตัว ตัวอักษรตัวแรกกำหนดว่าควรส่งคำสั่งอย่างไร ตัวอักษรสามตัวถัดไประบุถึงสิ่งที่ควรทำ
- พารามิเตอร์จะถูกคั่นด้วยช่องว่าง และแต่ละคำสั่งจะลงท้ายด้วยการขึ้นบรรทัดใหม่ (รหัส 0x0a) องค์ประกอบที่มีการหลีกคือ: "\s" - ช่องว่าง, "\n" - ขึ้นบรรทัดใหม่และ "\\" - แบ็กสแลช โปรโตคอลเวอร์ชันนี้สงวนอักขระ Escape อื่นๆ ทั้งหมดไว้สำหรับการใช้งานในอนาคต คำสั่งใดๆ ที่มีอักขระหลีกที่ไม่รู้จักจะต้องถูกละเว้น
- คำสั่งที่ส่งทั้งหมดจะต้องส่งในการเข้ารหัส UTF-8 - เข้ารหัส Unicode ในการทำให้เป็นมาตรฐาน C
- ลูกค้าควรละเว้นคำสั่งที่ไม่รู้จัก/ไม่ถูกต้อง ฮับต้องละเว้นคำสั่งที่ไม่ถูกต้อง และต้องส่งคำสั่งที่ไม่รู้จักตามประเภท (คำนำหน้า)
- ที่อยู่ไคลเอ็นต์จะต้องระบุในรูปแบบทศนิยมแบบจุด ("x.x.x.x") สำหรับ IPv4 หรือในรูปแบบ RFC (1884) สำหรับ IPv6 ที่อยู่ฮับจะต้องกำหนดโดยลิงก์ที่มีคำนำหน้า "adc" ซึ่งระบุถึงลักษณะเฉพาะของโปรโตคอลนี้ ("adc://server:port/")
- ตัวเลขจะถูกส่งเป็นสตริงตามมาตรฐานจุดลอยตัว โดยมีจุด "." ใช้เป็นตัวคั่นระหว่างเศษส่วนจำนวนเต็ม - จำนวนเต็มคือตัวเลขที่ไม่มีเศษส่วนและไม่มีการบวกเลขชี้กำลัง แอปพลิเคชันต้องสามารถทำงานกับตัวเลขบวก 64 บิต และตัวเลขทศนิยม 64 บิต คำนำหน้าการปฏิเสธคือเครื่องหมาย "-"
D (ข้อความโดยตรง)ฮับต้องส่งคำสั่งนี้ไปยังผู้ใช้ที่มี SID ที่ระบุ
E (ข้อความเสียงสะท้อน)ฮับจะต้องส่งคำสั่งไปยังผู้ใช้ด้วย sid และ my_sid
F (การถ่ายทอดคุณสมบัติ)ฮับต้องส่งคำสั่งนี้ไปยังไคลเอ็นต์ทั้งหมดที่รองรับ (+)/ไม่สนับสนุน (-) คุณลักษณะนี้ การสนับสนุนคุณลักษณะเฉพาะของไคลเอ็นต์จะพิจารณาจากฟิลด์ SU ซึ่งมีอยู่ในคำสั่ง INF ที่ส่งโดยไคลเอ็นต์
H (ข้อความฮับ)ไคลเอนต์ควรใช้ประเภทนี้เพื่อส่งคำสั่งที่มีไว้สำหรับฮับเท่านั้น
ฉัน (ข้อความข้อมูล)ฮับต้องใช้ประเภทนี้เพื่อส่งคำสั่งที่ไม่ได้ส่งโดยไคลเอนต์อื่น
คุณ (ข้อความ UDP)ไคลเอนต์ควรใช้คำสั่งนี้สำหรับการเชื่อมต่อ UDP โดยตรงเท่านั้น
ฟังก์ชันแฮช
คำสั่งบางคำสั่งใช้เพื่อกำหนดฟังก์ชันแฮช เมื่อใดก็ตามที่มีการสร้างการเชื่อมต่อใหม่โดยใช้คำสั่ง SUP ฟังก์ชันแฮชจะถูกแลกเปลี่ยน เมื่อทำการเชื่อมต่อ ไคลเอนต์จะส่งฟังก์ชันแฮชหลายอย่างไปยังเซิร์ฟเวอร์ผ่านพารามิเตอร์ของคำสั่ง SUP เซิร์ฟเวอร์รับหนึ่งในนั้นและส่งต่อไปยังไคลเอนต์ โดยวางไว้หน้าฟังก์ชันแฮชอื่น ๆ ในคำสั่ง SUP ที่ส่งจากเซิร์ฟเวอร์ ไคลเอนต์และฮับต้องมีฟังก์ชันแฮชที่เหมือนกันอย่างน้อยหนึ่งฟังก์ชัน ซึ่งจะใช้ในโปรโตคอลและในการระบุไฟล์
บัตรประจำตัวลูกค้า
ไคลเอนต์แต่ละรายจะถูกระบุด้วยตัวระบุที่แตกต่างกันสามตัว: ตัวระบุเซสชัน - รหัสเซสชัน (SID), ตัวระบุส่วนบุคคล - ID ส่วนตัว (PID) และตัวระบุไคลเอนต์ - รหัสไคลเอ็นต์ (CID)
ไฟล์
ชื่อไฟล์จะถูกนับจากรูทที่เกี่ยวข้อง (สมมติ) ในการแชร์ของผู้ใช้ "/" - ตัวคั่นไดเรกทอรี; แต่ละชื่อไฟล์หรือไดเร็กทอรีต้องไม่ซ้ำกันในบริบทที่ไม่คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ อนุญาตให้ใช้อักขระที่พิมพ์ได้ทั้งหมด รวมถึงช่องว่างในชื่อไฟล์ อักขระ "/" และ "\" เป็นอักขระหลีกโดยใช้อักขระ "\" ไคลเอนต์ต้องใช้ตัวกรองชื่อสำหรับระบบไฟล์ของตนเอง และชื่อไฟล์ที่ได้รับจากไคลเอนต์อื่นจะต้องเป็นไปตามกฎเหล่านี้ด้วย ชื่อพิเศษ "." และ ".." ไม่สามารถอยู่ในไดเรกทอรีหรือชื่อไฟล์ได้ ไฟล์รายการผลลัพธ์ใดๆ ที่มีชื่อเหล่านี้ควรถูกละเว้น ชื่อไดเร็กทอรีทั้งหมดต้องลงท้ายด้วย "/"
ไฟล์ที่แชร์จะถูกระบุโดยสัมพันธ์กับรูทที่ไม่มีชื่อ "/" ("/dir/subdir/filename.ext") ในขณะที่การต่อท้ายสามารถต่อท้ายชื่อรูทได้ ตัวอย่างเช่น "TTH/..." สำหรับส่วนเสริม TIGR จะใช้ชื่อรูท "TTH" เพื่อระบุไฟล์ด้วย "Tiger Tree Hash" สิ่งนี้ยอมรับไม่ได้สำหรับชื่อจากรูทที่ไม่มีชื่อซึ่งรวมอยู่ในการแชร์พร้อมตัวระบุโดยเช็คซัม
หากไม่มีชื่อไฟล์รูท "files.xml" จะระบุไฟล์ชีตที่สมบูรณ์ในรูปแบบ XML ที่เข้ารหัส UTF-8 ขอแนะนำให้ใช้โปรแกรมเสริมเพื่อบีบอัดไฟล์ชีตนี้
ส่วนเสริมสามารถเพิ่มนามสกุลของตัวเองให้กับชื่อไฟล์ได้ โดยปกติเพื่อหลีกเลี่ยงไม่ให้ชื่อซ้ำกัน
ประเภทพิเศษ "รายการ" ใช้เพื่อดูรายการไฟล์ รายการไฟล์บางส่วนมีโครงสร้างเหมือนกับรายการปกติ แต่ไดเร็กทอรีสามารถติดแท็กด้วยแอตทริบิวต์ Incomplete="1" ซึ่งบ่งชี้ถึงความลำเอียง เฉพาะไดเร็กทอรีที่ไม่มีไฟล์รูทเท่านั้นที่สามารถขึ้นต้นด้วยอักขระ "/" เนื้อหาของไดเร็กทอรีดังกล่าวจะถูกส่งไปยังไคลเอนต์ที่ร้องขอในระดับความลึกที่เขาเลือก (ซึ่งจำเป็นต้องส่งเฉพาะระดับที่ผู้ใช้ต้องการเท่านั้น) แอตทริบิวต์ "Base" สำหรับฟิลด์ "FileListing" จะกำหนดไดเร็กทอรีเฉพาะของไฟล์นี้
คุณสมบัติที่โดดเด่น:
- เวลาการแปลงที่รวดเร็ว: สูงสุด 1.4 µs
- ฟังก์ชั่นตัวอย่าง/แช่แข็งในตัว
- ไม่มีการสูญเสียรหัส
- ไม่ต้องการการปรับแต่งจากผู้ใช้
- แหล่งจ่ายเดี่ยว +5 V
- ไม่จำเป็นต้องใช้นาฬิกาภายนอก
- ปรับให้เข้ากับไมโครโปรเซสเซอร์ได้ง่าย
พื้นที่ใช้งาน:
- การประมวลผลสัญญาณดิจิตอล
- ระบบการรับข้อมูลที่รวดเร็ว
- โทรคมนาคม
- วงจรควบคุมเซอร์โวความเร็วสูง
- ระบบเครื่องเสียง
แผนภาพการทำงาน:
ปักหมุดตำแหน่ง:
คำอธิบาย:
ADC0820 IC เป็นตัวแปลงแอนะล็อกเป็นดิจิทัล (ADC) 8 บิตที่รองรับไมโครโปรเซสเซอร์ความเร็วสูง โดยใช้เทคโนโลยีฮาล์ฟแฟลชเพื่อให้ได้เวลาการแปลงที่ 1.4 µs ตัวแปลงมีช่วงสัญญาณอินพุตแบบอะนาล็อกตั้งแต่ 0 V ถึง +5 V และแหล่งจ่ายไฟเดี่ยวที่ +5 V
ระบบเก็บตัวอย่าง/เก็บตัวอย่างในตัวที่มีอัตราการสลูว์สูงถึง 100 mV/µs ทำให้ไม่ต้องใช้ระบบเก็บตัวอย่าง/เก็บตัวอย่างภายนอก
ADC นี้เข้ากันได้กับไมโครโปรเซสเซอร์ได้อย่างง่ายดาย ด้วยความสามารถในการเข้าถึงเป็นเซลล์หน่วยความจำหรือพอร์ต I/O โดยไม่จำเป็นต้องใช้ตรรกะการจับคู่ภายนอก เอาต์พุตข้อมูลมีระยะบัฟเฟอร์ที่มีสถานะลอจิคัลสามสถานะและระดับคงที่ ซึ่งช่วยให้คุณสามารถเชื่อมต่อ IC เข้ากับบัสข้อมูลไมโครโปรเซสเซอร์โดยตรง หรือกับพอร์ตข้อมูล I/O ของระบบ เอาต์พุตโอเวอร์โฟลว์ของ ADC ช่วยให้สามารถต่อ IC เพื่อให้ได้ระดับความละเอียดสูงขึ้น
ADC0820 ของ Maxim เข้ากันได้กับพิน ADC0820 ของ National Semiconductor และให้ประสิทธิภาพที่เหนือกว่า IC มีจำหน่ายในแพ็คเกจประเภทต่อไปนี้: 20-pin SO, DIP, CERDIP
ก่อนอื่นเราต้องเข้าใจส่วนประกอบที่เราใช้ในการสร้างเฟิร์มแวร์ก่อน และเราใช้ส่วนประกอบเดียวเท่านั้น - PWM8 PWM ย่อมาจาก Pulse width Modulator ซึ่งหมายถึง Pulse width Modulator สาระสำคัญของอุปกรณ์คือช่วยให้คุณสามารถเปลี่ยนความกว้างของพัลส์ที่สร้างโดยไมโครคอนโทรลเลอร์ได้ ดังนั้นการเปลี่ยนแรงดันเอาต์พุตสำหรับอุปกรณ์ที่ไม่ไวต่อความถี่
ตัวอย่างเช่น: ความถี่ในการทำงานของไมโครคอนโทรลเลอร์คือ 1Hz (นั่นคือระยะเวลาการสร้างพัลส์คือ 1 วินาที) ความกว้างพัลส์คือ 0.5 วินาที แรงดันพัลส์คือ 5V
ดังนั้นแรงดันเอาต์พุตเฉลี่ยต่อวินาทีคือ 2.5 โวลต์ และค่านี้ได้มาง่ายๆ โดยการเพิ่มพื้นที่ย่อยพัลส์แล้วหารด้วยระยะเวลาทั้งหมด เผื่อว่าฉันจะเขียนรายละเอียดให้มากกว่านี้ สมมติว่าเราใช้เวลา 1 วินาที จากรูปเราจะเห็นว่าชีพจรแรกอยู่ 0.5 เราคูณ 0.5s * 5V (แรงดันพัลส์) และหารทั้งหมดนี้ด้วยช่วงเวลา 0.5 วินาที*5V/1 วินาที = 2.5V หากเราต้องการแรงดันเอาต์พุต 3.33V เราจะต้องเพิ่มพื้นที่พัลส์เป็น 75% คำว่า รอบหน้าที่ มักปรากฏในวรรณกรรม ดังนั้นรอบการทำงานคืออัตราส่วนของระยะเวลาพัลส์ต่อระยะเวลาของศักย์ไฟฟ้าเป็นศูนย์เช่นในกรณีแรกคือ 50% สำหรับวินาที - 75%
ฉันคิดว่าทฤษฎีนี้เพียงพอแล้วและไม่มีปัญหาในการติดตั้ง PWM บนวงจร แต่การตั้งค่าของส่วนประกอบเองก็คุ้มค่าที่จะพิจารณาในรายละเอียดเพิ่มเติม ในการดำเนินการนี้ ฉันจะจัดเตรียมภาพหน้าจอโดยไฮไลต์พารามิเตอร์ที่เปลี่ยนแปลงไว้
นาฬิกาคือความถี่ในการทำงานของ PWM บล็อกดิจิทัลหรือแอนะล็อก-ดิจิทัลใด ๆ จะต้องทำงานที่ความถี่สัญญาณนาฬิกาที่แน่นอน นี่คือสาเหตุว่าทำไมตัวแบ่งความถี่และฟิลด์นาฬิกาจึงถูกประดิษฐ์ขึ้น SysClk คือความถี่ของระบบที่ตั้งไว้ในแท็บ Global Resources เป็นที่น่าสนใจที่จะทราบว่าในรายการดรอปดาวน์นาฬิกา จะมีฟิลด์ต่างๆ เช่น Row_0_Input_0 ซึ่งหมายความว่าตัวสร้างสัญญาณนาฬิกาของโมดูลสามารถอยู่นอกชิปได้ และจะถูกซิงโครไนซ์ผ่านบัส Row_0_Input_0
เปิดใช้งาน - ระดับหน่วยลอจิคัลของบล็อกนี้ โดยทั่วไปจะใช้สองมาตรฐาน: สูง = 5V และต่ำ = 3V ไมโครคอนโทรลเลอร์เองก็สามารถเปลี่ยนเป็นโหมดสูงหรือต่ำโหมดใดโหมดหนึ่งได้
CompareOut - เอาต์พุตโมดูเลเตอร์ความกว้างพัลส์
คำถามอาจเกิดขึ้น: เหตุใดจึงมีการเสนอทฤษฎีข้างต้นหากในทางปฏิบัติเราไม่เคยใช้มันเลย? และคำตอบก็คือเราใช้ค่าเริ่มต้นสำหรับความยาวพัลส์และช่วงเวลา (ฟิลด์ Period และ PulseWidth) 0 0 ด้วยค่าดังกล่าวเอาต์พุต PWM จะมีสัญญาณทึบเท่ากับค่าตรรกะ คุณยังสามารถเปลี่ยนช่วงเวลาและค่าความกว้างพัลส์โดยทางโปรแกรมในโหมดการทำงานของไมโครคอนโทรลเลอร์ได้โดยใช้ฟังก์ชัน PWM8_1_WritePeriod() และ PWM8_1_WritePulseWidth()
เอดีซีหรือเอดีซี
ADC - ตัวแปลงแอนะล็อกเป็นดิจิทัล (หรือ ADC ตัวแปลงแอนะล็อกเป็นดิจิทัล) เป็นอุปกรณ์ที่ให้คุณแปลงสัญญาณแอนะล็อกเป็นดิจิทัล ปริมาณทางกายภาพใดๆ (ความดัน ความเร็ว มุมการหมุน แรงดันไฟฟ้า กระแสไฟฟ้า ความเข้มของแสง) นั้นเป็นแบบอะนาล็อก และหน้าที่ของ ADC คือการแปลงให้เป็นสัญญาณดิจิทัล ในทางปฏิบัติ ค่าแรงดันไฟฟ้ามักจะใช้ในการแปลงเป็นสัญญาณดิจิทัล
จากคุณสมบัติหลายประการของ ADC ควรเน้นสามคุณสมบัติหลัก:
- ความลึกของบิตเป็นหน่วยที่เล็กที่สุดของสัญญาณอะนาล็อกที่ ADC สามารถตรวจพบได้ ซึ่งโดยปกติแล้วจะวัดเป็นบิต
- ความถี่การแปลง - จำนวนการวัดต่อวินาที วัดเป็น SPS (ตัวอย่างต่อวินาที)
- ช่วงการทำงาน - ช่วงของค่าที่ตัวแปลงนี้ทำงาน
เนื่องจาก ADC ไม่ใช่อุปกรณ์ธรรมดาๆ อย่าง PWM อีกต่อไป เราจะต้องดูแง่มุมทางทฤษฎีเพิ่มเติมของไมโครคอนโทรลเลอร์และคุณสมบัติบางอย่างของ ADC เอง
ลักษณะทั่วไปของไมโครคอนโทรลเลอร์
รายการแนวคิดและการกำหนดบางอย่างที่คุณต้องรู้เมื่อทำงานกับชิป PSoC (อย่างไรก็ตามและไม่เพียง แต่ทุกอย่างด้านล่างเท่านั้นที่จะเป็นจริงสำหรับไมโครคอนโทรลเลอร์ AVR)
ในคำอธิบายและแผนภาพวงจรในเอกสารข้อมูล การกำหนดเช่น Vcc, Vdd, Vss, AGND มักปรากฏขึ้น และความแตกต่างระหว่างพวกเขาบางครั้งก็ไม่ชัดเจนที่สุด Vcc คือแรงดันไฟฟ้าของไมโครคอนโทรลเลอร์ (cc - collector-to-collector) เช่นเดียวกับ Vdd มันเกิดขึ้นในอดีตว่าค่าเดียวกันมี 2 การกำหนด Vss คือค่าศักยภาพขั้นต่ำของไมโครคอนโทรลเลอร์ ซึ่งบ่อยครั้งที่ค่านี้เทียบเท่ากับ AGND ตัวอักษร "A" ในตัวย่อ AGND ระบุว่าเป็นดินเทียมหรือดินเทียม เป็นมูลค่าการกล่าวขวัญถึงแรงดันไฟฟ้าบนวงจรซึ่งมักเรียกว่า BandGap BandGrap คือการอ้างอิงแรงดันไฟฟ้า แรงดันอ้างอิงหมายถึงค่าคงที่โดยไม่คำนึงถึงแรงดันไฟฟ้า อุณหภูมิ และตัวบ่งชี้ภายนอกอื่นๆ ของ MK Vref คือแรงดันอ้างอิงของแต่ละโมดูลที่กำลังพิจารณา เป็นเวลานานมากที่ฉันไม่สามารถเข้าใจว่า Rail-to-Rail คืออะไร และฉันเจอวลีนี้ในบริบทเช่น: “โมดูลนี้สามารถทำงานในโหมด Rail-to-Rail” ดังนั้น Rail-to-Rail หมายความว่าองค์ประกอบสามารถทำงานได้ตลอดช่วงแรงดันไฟฟ้าตั้งแต่ Vcc ถึง AGND
ตัวอย่างที่ 2: การวัดแรงดันไฟฟ้า
ภารกิจ: วัดแรงดันไฟฟ้าบนโพเทนชิออมิเตอร์ที่เดินสายเข้าไปในบอร์ดดีบักและแสดงค่าบนหน้าจอ
นี่คือจุดที่น่าสนใจมากขึ้น ตามปกติแล้ว เราจะเปิดตัวนักออกแบบและสร้างโปรเจ็กต์ ไปที่โมดูลผู้ใช้ -> ข้อมูลเบ็ดเตล็ด -> LCD แล้วคลิกซ้ายเพื่อลากไปยังไมโครคอนโทรลเลอร์ LCD เป็นโมดูลที่มีประโยชน์และเรียบง่ายมากและยังไม่ใช้พื้นที่บนบล็อกดิจิทัลอีกด้วย คุณสามารถดูได้ในแท็บ Workspace Explorer จากการตั้งค่าเขาต้องเลือก LCDPort = Port_2 เท่านั้น ตอนนี้ไปที่ไฟล์ main.c ฉันขอเตือนคุณว่ามันอยู่ใน Workspace Explorer -> [ชื่อโปรเจ็กต์] -> ไฟล์ต้นฉบับ -> main.c และเพิ่มโค้ดต่อไปนี้ในฟังก์ชัน main()
จอแอลซีดี_เริ่ม(); จอแอลซีดี_ตำแหน่ง(0,0); LCD_PrCString("แรงดันไฟฟ้าที่วัดได้");
เรารวบรวมโค้ดและแฟลชไมโครคอนโทรลเลอร์ หากทุกอย่างถูกต้องเราจะไปที่หน้าจอบรรทัดที่เขียนไว้ด้านบน พวกเขาไม่สามารถคิดถึงวิธีที่ง่ายกว่านี้ในการควบคุมหน้าจอได้ และมันก็พอใจ ตอนนี้ก็ขึ้นอยู่กับ ADC แล้ว เลือก User Modules -> Legacy -> ADCINC12 แล้วโยนลงบนคอนโทรลเลอร์ คำถามอาจเกิดขึ้น: “ทำไมเราไม่เลือก ADCINC และ ADCINC12 และนอกจากนี้ จากโฟลเดอร์ Legacy เหตุผลอยู่ที่ความซับซ้อนในการเริ่มต้นโมดูล ADCINC นั้นเป็นโมดูลที่ซับซ้อนและยืดหยุ่นกว่าซึ่งต้องใช้ความระมัดระวังมากขึ้น และการกำหนดค่าอย่างละเอียด ในโฟลเดอร์ Legacy ซึ่งหมายถึงรุ่นเก่ามีโมดูลที่มีความยืดหยุ่นน้อยกว่า แต่ใช้งานได้ง่ายกว่า จากนั้นไปที่โฟลเดอร์ amplifers แล้วโยนลงในวงจร PGA (Programmable Gain Amplifier) . ไม่จำเป็นมากนักสำหรับการขยาย แต่สำหรับการเพิ่มความต้านทานอินพุตเพื่อให้ขนาดของกระแสไฟฟ้าในวงจรไม่ส่งผลต่อความแม่นยำของการวัด
ตั้งค่าการตั้งค่า PWM ตามภาพหน้าจอ
- กำไร - ปัจจัยกำไร
- อินพุต - อินพุตอุปกรณ์
- อ้างอิง - แรงดันอ้างอิง
เราตั้งค่า ADC ดังนี้:
- TMR Clock - ความถี่สัญญาณนาฬิกาของตัวจับเวลา
- อินพุต - อินพุตอุปกรณ์ (เชื่อมต่อกับ PGA)
- นาฬิกา CNT - ความถี่ตัวนับ
สิ่งสุดท้ายที่เราต้องการสำหรับการดำเนินงานปกติคือทรัพยากรระดับโลกที่เรียกว่า Ref Mux Ref Mux คือช่วงแรงดันไฟฟ้าในการทำงานของบล็อกแอนะล็อก หากเราตั้งค่า (Vdd/2)+/-(Vdd/2) เราจะได้ค่าความต่างศักย์ไฟฟ้าที่สมบูรณ์ตั้งแต่ 0 ถึง 5V แต่มีข้อเสียเปรียบประการหนึ่งที่ชัดเจนในเรื่องนี้ เนื่องจากแรงดันไฟจ่ายถูกใช้เป็นแรงดันอ้างอิง หากแรงดันไฟฟ้า Vdd ลอย จะส่งผลต่อความแม่นยำของผลลัพธ์ ในกรณีนี้ BandGap จะเป็นประโยชน์สำหรับเรา แต่อย่าเพิ่งกังวลไปในตอนนี้และตั้งค่า (Vdd/2)+/-(Vdd/2)
หากต้องการตรวจสอบอีกครั้ง ฉันจะโพสต์ภาพหน้าจอของการสลับบล็อกแอนะล็อกที่เกิดขึ้น
ไปที่ main.c และเพิ่มโค้ดต่อไปนี้ในฟังก์ชัน main():
PGA_Start (PGA_HIGHPOWER); //เริ่ม PGA ADCINC12_Start(ADCINC12_HIGHPOWER); //เริ่ม ADC ADCINC12_GetSamples(0); //ตั้งค่า ADC ให้ทำงานต่อเนื่อง M8C_EnableGInt ; // ไม่แสดงเครื่องหมายบรรทัดนี้เพื่อเปิดใช้งาน Global Interrupts ในขณะที่ (1) // main Firmware loop ( if (ADCINC12_fIsDataAvailable() != 0) // ตรวจสอบข้อมูลใน ADC ( result = ADCINC12_iGetData() + 2048; ADCINC12_ClearFlag(); LCD_Position( 1,0); // ตั้งค่าตำแหน่งสำหรับเอาต์พุต LCD_PrHexInt (ผลลัพธ์); // ส่งออกผลลัพธ์เป็นเลขฐานสิบหก )
2048 ถูกเพิ่มเข้าไปในข้อมูลของฟังก์ชัน iGetData() เพื่อแปลงข้อมูลให้เทียบเท่ากับที่ไม่ได้ลงนาม (หากคุณสนใจที่จะดู "ตัวแปรที่ลงนามและไม่ได้ลงนามใน c ++ ของ Google")
เราเชื่อมต่อโพเทนชิออมิเตอร์เข้ากับบอร์ดดังนี้
เราแฟลชไมโครคอนโทรลเลอร์และประเมินผลลัพธ์ของงาน
สิ่งที่เหลืออยู่คือการแปลงฐานสิบหกเป็นแรงดันไฟฟ้าและตรวจสอบความถูกต้องของข้อมูลด้วยเครื่องทดสอบ เราจะบรรลุเป้าหมายนี้ด้วยการทดลองล้วนๆ มาทำให้สถานการณ์ง่ายขึ้นสำหรับตัวเราเองและนำศักยภาพเป็นศูนย์เป็นค่า 0x0000 ที่เอาต์พุต ADC จากนั้นเราก็รันโปรแกรมที่เขียนไว้แล้ว หมุนโพเทนชิออมิเตอร์ไปที่ค่าสูงสุดแล้วดูค่าผลลัพธ์ ตัวอย่างเช่น ฉันได้รับ 0x0FEC จากนั้นเราก็นำผู้ทดสอบและวัดแรงดันไฟฟ้าจริงบนโพเทนชิออมิเตอร์ ได้ไฟ 4.78V. ตอนนี้เราหาร 4.78/0x0FEC (สำหรับผู้ที่มีปัญหากับระบบแคลคูลัส ฉันแนะนำให้คุณเพิ่มกำลัง) และเราจะได้ขั้นตอนการหาปริมาณ นั่นคือหน่วยแรงดันไฟฟ้าที่ค่าเอาต์พุต ADC หนึ่งค่าสอดคล้องกัน ผมได้ 0.0011727183513248 นี่คือตัวเลข ตอนนี้เราเพียงคูณผลลัพธ์จาก ADC ด้วยค่านี้แล้วแสดงบนหน้าจอ เมื่อต้องการทำเช่นนี้ ให้เพิ่มตัวแปรลงในฟิลด์การมองเห็นโดยรวม (นี่คือทุกสิ่งที่อยู่นอกฟังก์ชัน main())