STM32F1 ADC HAL

Started by tha, September 17, 2020, 09:42:20 AM

Previous topic - Next topic

tha


tha

main.c เอา //#include "stm32f10x_lib.h" ออกก็คอมไพล์ผ่านนะครับ

tha

ดูอยู่นาน โปรแกรมตัวนี้ ใช้ PA0 เป็น analog input ต้องต่อตัวต้านทานปรับค่าได้อีกตัว ต่อเข้ากับ PA0 เอาจั๊มเปอร์สวิทช์ WKUP ออกด้วย ไม่ได้ใช้ตัวต้านทานปรับค่าได้ PA1 บนบอร์ดนะครับ


tha

อันนี้ตัวอย่างของ ETT ใช้ PA1 บนบอร์ด การสตาร์ทการแปลงจะไม่เหมือนกับตัวอย่างที่แล้ว จะสตาร์ทด้วยการเซ็ตบิต Bit 22 SWSTART: Start conversion of regular channels ของ ADC control register 2 (ADC_CR2) (ดูที่หน้า 240 ของ reference manaul) บิตนี้จะถูกเคลียร์โดย hardware ทันทีเมื่อสตาร์ทการแปลงไปแล้ว

Quote
// Start the conversion
  ADC_SoftwareStartConvCmd(ADC1, ENABLE);


tha

ตัวอย่างแรกลืมใส่ RCC setup(); เข้าไปนะ โธ่ไม่น่าจะลืมเซ็ตคล็อคไปได้ อันนี้แก้ใขแล้วครับ


ตัวอย่างไฟวิ่งตาม ADC ของ ETT ลืมใส่คล็อค ADC prescaler หาร PCLK2 ด้วย 4 แก้ไขด้วยครับ
Quote
RCC_ADCCLKConfig(RCC_PCLK2_Div4);  // ADCCLK = PCLK2/4

tha

ADC Clock ต้องไม่เกิน 14MHz ใช่ไหมที่แปลไป ADC Clock เอามาจาก PCLK2 ที่มีคล็อคเท่ากับ 72MHz เราจึงต้องตั้ง
ADC prescaler = 4 เพื่อหาร 72MHz/4 = 18MHz เอ๊ะมันยังเกินอยู่นี่ ต้องหารด้วย 6 สิถึงจะได้ ADC Clock = 12MHz ไม่เกิน 14MHz แก้ใขกันด้วยครับ

tha

11.3.3 Channel selection (การเลือกชาแนล)
มีอยู่ 16 multiplexed channels. มันสามารถจัดระเบียบการแปลงเป็นสองกลุ่ม: regular และ injected. A group ประกอบด้วยลำดับของการแปลงที่สามารถทำได้กับช่องใดก็ได้และตามลำดับใด ๆก็ได้ ตัวอย่างเช่นสามารถทำได้ที่จะทำการแปลงในลำดับต่อไปนี้: Ch3, Ch8, Ch2,
Ch2, Ch0, Ch2, Ch2, Ch15.
• The regular group ประกอบด้วยการแปลงสูงสุดถึง 16 การแปลง. The regular channels และลำดับการแปลงของมันต้องถูกเลือกใน the ADC_SQRx registers. จำนวณของการแปลงทั้งหมดใน the regular group ต้องถูกเขียนลงใน the L[3:0] bits ใน the ADC_SQR1 register.

• The injected group ประกอบด้วยการแปลงสูงสุดถึง 4 การแปลง. The injected channels และลำดับการแปลงของมันต้องถูกเลือกใน the ADC_JSQR register. จำนวณของการแปลงทั้งหมดใน the injected group ต้องถูกเขียนลงใน the L[1:0] bits ใน the ADC_JSQR register.

ถ้า the ADC_SQRx or ADC_JSQR registers ถูกแก้ไขในระหว่างการแปลง, การแปลงปัจจุบันจะถูกยกเลิก(reset)และ a new start pulse จะถูกส่งไปยัง the ADC เพื่อทำการแปลงกลุ่มใหม่ที่เลือก

Temperature sensor/VREFINT internal channels
The Temperature sensor ถูกต่อเข้ากับชาแนล ADCx_IN16 และ the internal reference voltage VREFINT ถูกต่อเข้ากับ ADCx_IN17. ทั้งสอง internal channels นี้สามารถถูกเลือกและแปลงได้ทั้งแบบ injected หรือ regular channels.
บันทึก: The sensor นี้และ VREFINT สามารถใช้งานได้กับ the master ADC1 peripheral เท่านั้น

tha

ท่านใใดแนะนำมาให้ตั้งตัวคูณ PLL =7 ก็จะได้ system clock = 56MHz แล้วตั้ง ADC prescaler ให้หาร PCK2 ด้วย 4 ก็จะได้ ADC clock = 14MHz ซึ่งเป็นค่าสูงสุดพอดี ก็จะแปลงได้เร็วขึ้น

Quote
      RCC_ADCCLKConfig(RCC_PCLK2_Div4);  // ADCCLK = PCLK2/4 = 14MHz
      FLASH_SetLatency(FLASH_Latency_2); // Flash 2 wait state
      FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);  // Enable Prefetch Buffer
      RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_7);   // PLLCLK = 8MHz * 7 = 56 MHz