ความถี่ควบคุมฮาร์ดแวร์ PWM


21

ฉันกำลังใช้เอาต์พุตฮาร์ดแวร์ PWM พร้อมการเดินสาย มีฟังก์ชัน pwmSetClock ที่ควรเปลี่ยนความถี่ ( https://projects.drogon.net/raspberry-pi/wiringpi/functions/ ) ฉันเชื่อว่าตั้งแต่ค่าเริ่มต้นคือ 200 Mhz การตั้งค่าตัวหารเป็น 200000000 ควรทำให้ LED ติดกับแฟลชเอาต์พุตอย่างเห็นได้ชัด แต่นั่นไม่ใช่กรณี

สิ่งนี้สามารถเปลี่ยนแปลงได้?


1
ฉันกำลังทำการทดสอบกับฮาร์ดแวร์ PWM และดูเหมือนว่าจะไม่มีความถี่ pwmWrite()มันผันแปรไปขึ้นอยู่กับการตั้งค่าความกว้างในการเต้นของชีพจร ไม่ใช่สิ่งที่ฉันคาดว่าจะเกิดขึ้น
TheMeaningfulEngineer

คำตอบ:


25

เมื่อเร็ว ๆ นี้ฉันมีเหตุผลบางอย่างที่จะเริ่มต้นทดสอบด้วยตัวเองของ PWM และพบว่า (ตามที่ระบุโดยหนึ่งในความคิดเห็น) ความถี่ดูเหมือนจะแตกต่างกันไปตามวัฏจักรหน้าที่ - bizzare ใช่ไหม? ปรากฎว่า Broadcom ใช้ "สมดุล" PWM เพื่อให้การเปิดและปิดพัลส์ PWM กระจายอย่างสม่ำเสมอเท่าที่จะทำได้ พวกเขาให้รายละเอียดเกี่ยวกับอัลกอริทึมและการอภิปรายเพิ่มเติมในหน้า 139 ของแผ่นข้อมูลของพวกเขา: http://www.element14.com/community/servlet/JiveServlet/downloadBody/43016-102-1-231518/Broadcom.Datsheet.pdf

ดังนั้นสิ่งที่คุณต้องการคือการใส่ PWM ในโหมด mark-space ซึ่งจะให้ PWM แบบดั้งเดิม (และคาดเดาได้ง่าย) ที่คุณต้องการ:

pwmSetMode(PWM_MODE_MS);

คำตอบที่เหลือถือว่าอยู่ในโหมด mark-space

ฉันยังได้บางการทดลองกับช่วงที่อนุญาตของค่าสำหรับและpwmSetClock() pwmSetRange()ตามที่ระบุไว้ในหนึ่งในคำตอบอื่น ๆ ช่วงที่ถูกต้องสำหรับpwmSetClock()ดูเหมือนจะไปจาก 2 ถึง 4095 ในขณะที่ช่วงที่ถูกต้องสำหรับpwmSetRange()ได้ถึง 4096 (ฉันไม่ได้พยายามหาขีด จำกัด ล่าง)

ช่วงและนาฬิกา (ชื่อที่ดีกว่าน่าจะเป็นตัวหาร) จะส่งผลต่อความถี่ ช่วงนี้มีผลต่อความละเอียดด้วยดังนั้นในขณะที่อาจเป็นไปได้ที่จะใช้ค่าที่ต่ำมาก ตัวอย่างเช่นหากคุณใช้ช่วงของ 4 คุณสามารถบรรลุความถี่ที่สูงขึ้น แต่คุณจะสามารถตั้งค่ารอบการทำงานเป็น 0/4, 1/4, 2/4, 3/4 หรือ 4/4

นาฬิกา Raspberry Pi PWM มีความถี่พื้นฐานที่ 19.2 MHz ความถี่นี้หารด้วยอาร์กิวเมนต์ถึงpwmSetClock()คือความถี่ที่ตัวนับ PWM เพิ่มขึ้น เมื่อตัวนับถึงค่าเท่ากับช่วงที่ระบุมันจะรีเซ็ตเป็นศูนย์ ในขณะที่ตัวนับน้อยกว่ารอบการทำงานที่ระบุเอาท์พุทจะสูงมิฉะนั้นเอาต์พุตจะต่ำ

ซึ่งหมายความว่าหากคุณต้องการตั้งค่า PWM ให้มีความถี่เฉพาะคุณสามารถใช้ความสัมพันธ์ต่อไปนี้:

pwmFrequency in Hz = 19.2e6 Hz / pwmClock / pwmRange.

หากคุณใช้ค่าสูงสุดที่อนุญาตสำหรับpwmSetClock()และpwmSetRange()คุณจะได้รับความถี่ PWM ฮาร์ดแวร์ขั้นต่ำที่สามารถทำได้ ~ 1.14 Hz สิ่งนี้จะทำให้แสงที่เห็นได้ชัดเจน (มากกว่าแฟลชจริง ๆ ) ไปยัง LED ฉันยืนยันสมการข้างต้นด้วยสโคปและดูเหมือนว่าจะถือ ขีด จำกัด ความถี่สูงสุดจะได้รับผลกระทบจากความละเอียดที่คุณต้องการดังที่อธิบายไว้ข้างต้น


เกี่ยวกับขอบเขตล่างของ pwmRange: ฉันตั้งค่าเป็น 2 สำเร็จ (เพื่อรับรอบการทำงาน 50%)
Ted Pudlik

จากแหล่งใดที่คุณรู้ว่านาฬิกา pwm มีความถี่ 19.2 mhz
thi gg

10

ตามสูตรนี้:

pwmFrequency in Hz = 19.2e6 Hz / pwmClock / pwmRange

เราสามารถตั้งค่าpwmClock=1920และpwmRange=200รับpwmFrequency=50Hz:

50 Hz = 19.2e6 Hz / 1920 / 200

ฉันทดสอบกับ alarmpi:

$ pacman -S wiringpi
$ gpio mode 1 pwm
$ gpio pwm-ms
$ gpio pwmc 1920
$ gpio pwmr 200     # 0.1 ms per unit
$ gpio pwm 1 15     # 1.5 ms (0º)
$ gpio pwm 1 20     # 2.0 ms (+90º)
$ gpio pwm 1 10     # 1.0 ms (-90º)

หมายเหตุ:เซอร์โวของฉันคาดว่าสัญญาณ50Hz


คุณมาได้อย่างไร: 'gpio pwmr 200 # 0.1 ms ต่อหน่วย'
mxlian

50Hz ---> 20ms ต่อรอบ 20ms / 200 units = 0.1ms ต่อหน่วย
mxlian

5

นี่คือรหัสที่ฉันใช้ ฉันพยายามที่จะดูว่าจะมีอะไรเปลี่ยนแปลงเมื่อฉันเปลี่ยนการตั้งค่า

#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

int main (void)
{
  printf ("Raspberry Pi wiringPi test program\n") ;

  if (wiringPiSetupGpio() == -1)
    exit (1) ;

  pinMode(18,PWM_OUTPUT);
  pwmSetClock(2);
  pwmSetRange (10) ;
  pwmWrite (18, 5);

for (;;) delay (1000) ;
}

pwmSetClock (1); -> 2.342kHz

pwmSetClock (2); -> 4.81MHz

pwmSetClock (3) -> 3.19MHz

pwmSetClock (4); -> 2.398MHz

pwmSetClock (5) -> 1.919MHz

pwmSetClock (6); -> 1.6MHz

pwmSetClock (7); -> 1.3MHz

pwmSetClock (8); -> 1.2MHz

pwmSetClock (9); -> 1.067MHz

pwmSetClock (10); -> 959kHz

pwmSetClock (11); -> 871kHz

pwmSetClock (20); -> 480kHz

pwmSetClock (200); -> 48kHz

pwmSetClock (500); -> 19kHz

pwmSetClock (1000) -> 9.59kHz

pwmSetClock (2000); -> 4.802kHz

pwmSetClock (4000); -> 2.401kHz

pwmSetClock (5000); -> 10.58kHz

จากสิ่งที่ฉันได้ทดสอบดูเหมือนว่าตัวหารจะมีค่าตั้งแต่ 2 ถึงบางส่วนน้อยกว่า 5000 ฉันเดาว่ามันมีบางอย่างที่เกี่ยวข้องกับการแทนเลขฐานสองของตัวเลขเหล่านั้นซึ่งตั้งค่าโดยตรงในการลงทะเบียน เมื่อตัวเลขที่เป็นตัวแทนของไบนารี่มีบิตมากกว่ารีจิสเตอร์ก็สามารถรับได้เพียงบิตแรกและตีความตัวเลขด้วยวิธีนั้น นั่นเป็นสาเหตุที่พฤติกรรมแปลก ๆ เกิดขึ้นเมื่อคุณเปลี่ยนจาก 4,000 เป็น 5,000


1
ฉันจะเปลี่ยนรอบการทำงานได้อย่างไร
noufal

คุณวัดความถี่ได้อย่างไร
Seanny123
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.