RF24 +高速パルス

私は、タイマ1を使用して100kHzのPWMを生成するためにarduinoを使用しています

void setup() {
 //put your setup code here, to run once:

  //Timer 1 Fast PWM mode *toggling* OC1A at 50kHz with *two* OCR1A counts
  //And 7.32 bits 0-159 PWM on OC1B at 100kHz
  //Output on OC1B  
  //Set at TOP, Clear at OCR1B
  //WGM =15 0b1111 

   DDRB |= bit(DDB1) | bit(DDB2); //atmega168/UNO OC1A and OC1B (Tested by OP/Luis)

   TCCR1A =  bit(WGM11) | bit(WGM10) | bit(COM1A0) | bit(COM1B1)  ;//Toggle OC1A, Clear on OC1B    
   TCCR1B =ビット(WGM13)|ビット(WGM12)|ビット(CS10)。 //プリスケーラを1に設定する
   OCR1A  = 159 ;//79;   //Set TOP count to 16000000/(2*PreScaler*Ftoggle)
                         //or 16000000/(PreScaler *Ftimer)
   OCR1B  = 10;          //10/160 duty cycle
   TCNT1 = 0 ;
}

void loop() {
 //put your main code here, to run repeatedly:
  OCR1B = 160/4 -1 ;//25% duty cycle. 
}

私はこれを使ってモジュールをテストしました:

Receiver
#include 
#include "nRF24L01.h"
#include "RF24.h"
int msg[1];
RF24 radio(9,10);
const uint64_t pipe = 0xE8E8F0F0E1LL;
int LED1 = 3;

void setup(void){
 Serial.begin(9600);
 radio.begin();
 radio.openReadingPipe(1,pipe);
 radio.startListening();
 pinMode(LED1, OUTPUT);}

void loop(void){
 if (radio.available()){
   bool done = false;    
   while (!done){
     done = radio.read(msg, 1);      
     Serial.println(msg[0]);
     if (msg[0] == 111){delay(10);digitalWrite(LED1, HIGH);}
     else {digitalWrite(LED1, LOW);}
     delay(100);}}
 else{Serial.println("No radio available");}}

トランスミッタ

#include  
#include "nRF24L01.h"
#include "RF24.h"
int msg[1];
RF24 radio(9,10);
const uint64_t pipe = 0xE8E8F0F0E1LL;
int SW1 = 7;

void setup(void){
 Serial.begin(9600);
 radio.begin();
 radio.openWritingPipe(pipe);}

void loop(void){
 if (digitalRead(SW1) == HIGH){
 msg[0] = 111;
 radio.write(msg, 1);}}

I'm using this library https://github.com/TMRh20/RF24

そして、それは大丈夫です、今最初の問題は、RF24とpwm ピン10を使用していますが、ライブラリで変更することができるので、代わりにピン7を使用しています。私はもう一度それをテストし、まだ正常に動作します。

しかし、セットアップ時に回線を追加してpwdを使用すると、通信は機能しません

   DDRB |= bit(DDB1) | bit(DDB2); //atmega168/UNO OC1A 

   TCCR1A =  bit(WGM11) | bit(WGM10) | bit(COM1A0) | bit(COM1B1)  ;//Toggle OC1A, Clear on OC1B    
   TCCR1B =ビット(WGM13)|ビット(WGM12)|ビット(CS10)。 //プリスケーラを1に設定する
   OCR1A  = 159 ;//79;   //Set TOP count to 16000000/(2*PreScaler*Ftoggle)
                         //or 16000000/(PreScaler *Ftimer)
   OCR1B  = 10;          //10/160 duty cycle
   TCNT1 = 0 ;

私は行ごとに試して、問題はここにあります:

TCCR1B =ビット(WGM13)|ビット(WGM12)|ビット(CS10)。 //プリスケーラを1に設定する

プリスケーラを1に設定するとき。

このタイマのRF24の依存関係はどれですか?私はそれを動作させる必要があるオプション

EDIT。

今私はCEとCSのピン6と7を使用しています また、レジスタ設定から "| bit(COM1A0)"を削除しました

まだ動作しません

私はこれを持っている

void setup(void)
{

  /// RF settings

  Serial.begin(9600);
 radio.begin();
 //radio.openReadingPipe(1,pipe);
 //radio.startListening();
 pinMode(LED1, OUTPUT);

 /// end RF settings


  //// pwd settings
 DDRB |= bit(DDB1) | bit(DDB2);  
   OCR1A  = max_count;      //16000000/(PreScaler *Ftimer)
   OCR1B  = 10;           
   TCCR1A =  bit(WGM11) | bit(WGM10) |  bit(COM1B1);//bit(COM1A0) | Toggle OC1A, Clear on OC1B    
   TCCR1B =ビット(WGM13)|ビット(WGM12)|ビット(CS10)。 //プリスケーラを1に設定する
   TCNT1 = 0 ;

  //// 
 }

RF24の設定の前にPWMの設定をしてもPWMが機能しない場合、RF設定は最初は通信が機能しません。

radio.begin()はレジスタを上書きする必要がありますが、どのように見つけられません。

1
追加された 編集された
ビュー: 25
ピン10をPWMとして使用しているため、ピン10をSPIの出力に設定して動作させる必要があるSPIモジュールを台無しにしているのでしょうか?
追加された 著者 Majenko,
nRFはピン10を必要としませんが、SPIは必要ありません。それはハードウェアのことです。仮題10なしでpwmを実行できる場合は、それを証明するか反証するかもしれません。
追加された 著者 Majenko,
"TCCR1A =ビット(WGM11)|ビット(WGM10)|ビット(COM1A0)|ビット(COM1B1); //トグルOC1A、OC1Bでクリア"ラインはPWMを設定してOC1AピンとOC1Bピンの両方を制御します。 Arduino Unoでは10で、9番ピンは "RF24ラジオ(9,10 \\ 7)"ごとにRF24と干渉します。ライン?もしそうなら、 "ビット(COM1A0)"部分を取り出して、PWMではなくデジタルIOのためにピン9を解放することができます。
追加された 著者 Dave X,
@DaveX私はそれを試しても、まだ動作しません
追加された 著者 Luis Ramon Ramirez Rodriguez,
@Majenko、RF24でピン10を使用する必要がない場合はどうすればSPIライブラリが問題を引き起こしているかどうかを確認できます
追加された 著者 Luis Ramon Ramirez Rodriguez,

1 答え

タイマー1の代わりにタイマー2を使って100kHzのPWMを行うのも良いでしょう。レジスタはtimer1と似ていますが、8ビットしかないので、比較レジスタとカウントレジスタでは255を超えることはできません。プリスケーラは同じで、タイマ制御のピンはD11とD3です。

  //// pwm settings for 100kHz on Timer 2
  //// Toggle OC2A/D11/PB3 at 50kHz, PWM OC2B/D3/PD3 at 100kHz:
   DDRB |= bit(DDB3); //Enable output
   DDRD |= bit(DDD3); //Enable output 
  //WGM2x=0b111 for fast PWM with TOP=OCR2A
  //COM2Ax=0b01 for toggle OC2A at OCR2A
  //COM2Bx=0b10 for [email protected]@match_OCR2B PWM 
   TCCR2A =   bit(WGM21)  | bit(WGM20)  
            | bit(COM2B1) //PWM on OC2B
            | bit(COM2A0);//Toggle OC2A    
   TCCR2B =   bit(WGM22) | bit(CS20); //Set /1 prescaler
   OCR2A  = 159;      //16000000/(PreScaler *Ftimer)-1
   OCR2B  = 10;       //6.25% PWM
   TCNT2 = 0 ;

私はこれをUno/Atmega328Pでテストしていませんが、データシート(p153-157)をご覧ください。

50kHzのトグルと100kHzの両方のPWM出力を必要としない場合は(コードのように)、どちらか一方を無効にして、必要に応じて周波数を調整します。

1
追加された