STM32F1 ADC HAL

  • 67 Replies
  • 621 Views
*

Offline tha

  • *****
  • 1301
    • View Profile
Re: STM32F1 ADC HAL
« Reply #8 on: September 17, 2020, 07:17:19 pm »
ตัวอย่างโปรแกรมครับ http://www.mediafire.com/file/7l0zyvcwsgfnss4/ET-STM32F103_ADC.rar/file

*

Offline tha

  • *****
  • 1301
    • View Profile
Re: STM32F1 ADC HAL
« Reply #9 on: September 17, 2020, 07:22:49 pm »
main.c เอา //#include "stm32f10x_lib.h" ออกก็คอมไพล์ผ่านนะครับ

*

Offline tha

  • *****
  • 1301
    • View Profile
Re: STM32F1 ADC HAL
« Reply #10 on: September 18, 2020, 05:09:02 am »
ดูอยู่นาน โปรแกรมตัวนี้ ใช้ PA0 เป็น analog input ต้องต่อตัวต้านทานปรับค่าได้อีกตัว ต่อเข้ากับ PA0 เอาจั๊มเปอร์สวิทช์ WKUP ออกด้วย ไม่ได้ใช้ตัวต้านทานปรับค่าได้ PA1 บนบอร์ดนะครับ

*

Offline tha

  • *****
  • 1301
    • View Profile
Re: STM32F1 ADC HAL
« Reply #11 on: September 18, 2020, 05:30:45 am »
อันนี้ตัวอย่างของ 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);

http://www.mediafire.com/file/9bod9jg1dqkfg3p/ET-STM32F103_ADC%25282%2529.rar/file

*

Offline tha

  • *****
  • 1301
    • View Profile
Re: STM32F1 ADC HAL
« Reply #12 on: September 18, 2020, 06:16:27 am »
ตัวอย่างแรกลืมใส่ RCC setup(); เข้าไปนะ โธ่ไม่น่าจะลืมเซ็ตคล็อคไปได้ อันนี้แก้ใขแล้วครับ
http://www.mediafire.com/file/o1x1xo376bszyjn/ET-STM32F103_ADC%25283%2529.rar/file

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

*

Offline tha

  • *****
  • 1301
    • View Profile
Re: STM32F1 ADC HAL
« Reply #13 on: September 18, 2020, 06:33:16 am »
ADC Clock ต้องไม่เกิน 14MHz ใช่ไหมที่แปลไป ADC Clock เอามาจาก PCLK2 ที่มีคล็อคเท่ากับ 72MHz เราจึงต้องตั้ง
ADC prescaler = 4 เพื่อหาร 72MHz/4 = 18MHz เอ๊ะมันยังเกินอยู่นี่ ต้องหารด้วย 6 สิถึงจะได้ ADC Clock = 12MHz ไม่เกิน 14MHz แก้ใขกันด้วยครับ

*

Offline tha

  • *****
  • 1301
    • View Profile
Re: STM32F1 ADC HAL
« Reply #14 on: September 18, 2020, 06:51:26 am »
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 เท่านั้น

*

Offline tha

  • *****
  • 1301
    • View Profile
Re: STM32F1 ADC HAL
« Reply #15 on: September 18, 2020, 08:29:27 am »
ท่านใใดแนะนำมาให้ตั้งตัวคูณ 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