Domanda

Sto usando Beaglebone Not Beaglebone Black.

Ho appena provato a produrre un PWM e mi aspettavo potenziali frequenze di alcuni megaherz su un dispositivo così veloce.

Ho scoperto che 100Hz è il massimo esatto che posso impostare attraverso Sysfs.
Ho iniziato a scavare online per esempi e non ho menzionato un limite, ma non hanno anche mostrato un valore più veloce di 100Hz.

Esempio:

root@beaglebone:/sys/class/pwm/ehrpwm.0:0# echo 10000000 >  period_ns 
root@beaglebone:/sys/class/pwm/ehrpwm.0:0# echo 1000000 >  period_ns 
-sh: echo: write error: Invalid argument
root@beaglebone:/sys/class/pwm/ehrpwm.0:0# echo 200 >  period_freq 
-sh: echo: write error: Invalid argument
root@beaglebone:/sys/class/pwm/ehrpwm.0:0# echo 101 >  period_freq 
-sh: echo: write error: Invalid argument
root@beaglebone:/sys/class/pwm/ehrpwm.0:0# echo 100 >  period_freq 
root@beaglebone:/sys/class/pwm/ehrpwm.0:0#
.

Qualsiasi AVR 10cent può fare un PWM più veloce di quello.
C'è qualche trucco che mi mancava?
Devo davvero creare un PWM personalizzato da Mangallz a commuovere GPIO se voglio una frequenza più rapida di 100 Hz?!

È stato utile?

Soluzione

Ho effettivamente trovato la soluzione poco dopo aver aperto la mia domanda.
Lo posterò qui come penso che questo potrebbe effettivamente causare più di quanto solo mi chiedo :)

La frequenza PWM è ovviamente limitata come quella su un dispositivo da 1 GHz, il driver del kernel non funziona nello stesso modo in cui ci si aspetterebbe.

Se si inserisce un valore di Duty_Penct (come l'1 percento), il driver sembra semplicemente calcolare il valore Duty_NS di esso e dimentica la percentuale in seguito.
Un utente normale penserebbe che sia in "modalità percentuale", ma in realtà il file percentuale è semplicemente legato a un wrapper per aiutare.
Lo stesso conteggio per la frequenza!
Se ora si modifica la frequenza su un valore più alto, allora il kernel controlla se il periodo di ciclo di Duty_ns si inserisce nel nuovo periodo totale_ns!
Ignora che hai effettivamente impostato una percentuale!

Quindi ovviamente non puoi avere un periodo più grande dell'intero periodo, quindi fallisce.

Testo lungo breve Summary:
Imposta sempre Duty_cycle to zero Prima di impostare la frequenza Se il valore precedente non si adatta al nuovo periodo, questo evita la frustrazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top