คำอธิบาย ADDC คำอธิบายของโปรโตคอล ADC

22.12.2023 จอภาพ

ไมโครคอนโทรลเลอร์ STM32 มีโมดูล ADC อันทรงพลังซึ่งมีประสิทธิภาพที่ดีและคุณสมบัติที่น่าสนใจ:

  • ช่องสัญญาณเข้า 18 ช่อง (ภายนอก 16 ช่อง และภายใน 2 ช่อง)
  • ความละเอียด 12 บิต
  • โหมดการแปลงต่างๆ:
    1. ครั้งหนึ่ง
    2. อย่างต่อเนื่อง
    3. โดยทริกเกอร์
    4. โดยจับเวลา
  • การจัดตำแหน่งบิตผลลัพธ์ที่สะดวก
  • แน่นอนว่าสร้างการขัดจังหวะและสัญญาณทุกประเภทสำหรับ 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: ไม่มีการหยุดชะงัก โดยไม่มีโหมดที่ซับซ้อนใดๆ เราเพียงแค่นำไปใช้และวัดเป็นรอบ

การเริ่มต้น

  1. เปิดการตอกบัตรของโมดูล ADC
  2. การกำหนดค่าพารามิเตอร์โมดูล
  3. เปิดโมดูล ADC
  4. การกำหนดค่าอินพุต (หมายเลขช่อง ADC)
  5. เราดำเนินการสอบเทียบ

ฉันคิดว่าขาคริสตัลไม่ได้รับการกำหนดค่า กล่าวคือ ขาเหล่านั้นอยู่ในสถานะ "อินพุตแบบอะนาล็อก" เริ่มต้น นี่คือระบอบการปกครองที่เราต้องการ

มีเพียงขา 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

การวัด

การวัดนั้นง่าย:

  1. เริ่มต้นการเปลี่ยนแปลง
  2. เรากำลังรอการสิ้นสุดของการแปลงเป็นดิจิทัล (ตรวจสอบธง EOC = สิ้นสุดการแปลง)
  3. การอ่านผลลัพธ์จากการลงทะเบียน DR
uint16_t get_adc_value() ( ADC_SoftwareStartConvCmd(ADC1, เปิดใช้งาน); ในขณะที่ (ADC_GetFlagStatus (ADC1, ADC_FLAG_EOC) == RESET); ส่งคืน ADC_GetConversionValue (ADC1); )

การใช้ฟังก์ชันเหล่านี้ที่ง่ายที่สุดคือ:

โมฆะ 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 ควรเน้นสามคุณสมบัติหลัก:

  1. ความลึกของบิตเป็นหน่วยที่เล็กที่สุดของสัญญาณอะนาล็อกที่ ADC สามารถตรวจพบได้ ซึ่งโดยปกติแล้วจะวัดเป็นบิต
  2. ความถี่การแปลง - จำนวนการวัดต่อวินาที วัดเป็น SPS (ตัวอย่างต่อวินาที)
  3. ช่วงการทำงาน - ช่วงของค่าที่ตัวแปลงนี้ทำงาน

เนื่องจาก 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 ตามภาพหน้าจอ

  1. กำไร - ปัจจัยกำไร
  2. อินพุต - อินพุตอุปกรณ์
  3. อ้างอิง - แรงดันอ้างอิง

เราตั้งค่า ADC ดังนี้:

  1. TMR Clock - ความถี่สัญญาณนาฬิกาของตัวจับเวลา
  2. อินพุต - อินพุตอุปกรณ์ (เชื่อมต่อกับ PGA)
  3. นาฬิกา 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())