2017-01-26 9 views
0

2入力、1Hz信号、50Hz信号があるラズベリーパイでプログラムを実行しています。私は、50Hz信号の立ち上がりから1Hz信号の立ち上がりまでの経過時間を記録し、次に位相差を計算しています。私はキーが50Hz波形の立ち上がりの現在の時間を表し、その値が1Hz信号に対する位相差となるようにしたい。whileループからの変数結果を辞書(Python)に格納

は、ここに私のコードです:

import pigpio 
import time 
import math 
from datetime import datetime 

counter = 0 
1HZ_PIN = 23 
50HZ_PIN = 24 
pi = pigpio.pi() 
d = {} 

pi.set_mode(1HZ_PIN, pigpio.INPUT) 
pi.set_pull_up_down(1HZ_PIN, pigpio.PUD_UP) 
pi.set_mode(50HZ_PIN, pigpio.INPUT) 
pi.set_pull_up_down(50HZ, pigpio.PUD_UP) 

while True: 
    if pi.wait_for_edge(1HZ_PIN, pigpio.RISING_EDGE): 
     print 'PPS Rising edge' 
     t1 = datetime.now() 
     print t1 
     counter = 0 

     while pi.wait_for_edge(50HZ_PIN, pigpio.RISING_EDGE) and counter <50): 
      d = {} 
      counter = counter + 1 
      print 'Voltage Sinusoid rising edge' 
      print datetime.now() 
      x = datetime.now() 
      x.isoformat() # I added this line as you can't place datetime objects in a dictionary 
      elapsed_time = x - t1 
      elapsed_time_float = elapsed_time.total_seconds() # can't prerform arithmetic operations on datetime object 
      phase = elapsed_time_float/0.02/360 
      d[x] = phase 

私は、キーと値として対応する位相差として記録された各立ち上がり時間を置くだろうと推測最後の行。しかし、リストに50個のキー/値のペアが予想通りに辞書に印刷されていますが、印刷された立ち上がり時間と一致しません。辞書からループ中に変数を配置する適切な方法はありますか?

+3

クイックノート:変数は '1HZ_PIN'や' 50HZ_PIN'のような数字で始めることはできません –

+0

もう一つの簡単なことですが、 'x.isoformat()'はxを文字列に変換しません。 xの結果を格納する必要があります。別の変数のisoformat()しかし、datetimeオブジェクトをPythonのキーとして使用することができます。そのため、間違いからエラーが発生することはありません。コードに影響を与えずにその行を削除できるはずです。 –

+0

@Jerry Stratton私はその行を削除し、あなたが言ったように何の効果もありませんでしたが、なぜキーが印刷された立ち上がり時間に一致していません。コンソールから結果を含めるようにしますか?私は彼らが時系列順になるだろうと推測しているので、キーで辞書には順序はありません。 –

答えて

1

私はあなたのdatetime値を印刷していると思う:

print 'Voltage Sinusoid rising edge' 
print datetime.now() 

、あなたは再びそれを計算し、変数に保存します。

x = datetime.now() 

これらの2回は異なる可能性があります。それを変更すると:

x = datetime.now() 
print x 

となります。一致する印刷時間と保存時間を取得する必要があります。

+0

これは、おかげで、ありがとう。 –

0

私は@ user3811623が正しい答えを持っていると信じています。 @JerryStrattonは、前述のようにあなたにも戻ってxに値を代入したい、そのためにあなたは、()だけx.isoformatを適用することにより、xの値を変更しない、

  • を - - 私も指摘したかった

x = x.isoformat()

  • 辞書のキーは、キー入射順序を維持するために、時系列順にソートされていない、あなたがしたいordereddict -

https://docs.python.org/3/library/collections.html#collections.OrderedDict

  • 私はそれは好奇心、あなたはこのようにそれをリセットし、あなたがループ内でそれを開始すると、辞書で50 valuessを取得していることがわかります。たとえば、

> t 
> y 
> u 
> s 

利回り

>>>d 
{'s': 's'} 

ないあなたはここで50個のキーに取得しているか確認してくださいとthis-

while true: 
    d={} 
    x=raw_input('> ') 
    d[k]=k 
    if k=='s': 
     break 

関連する問題