RF24 + Hoge snelheid pwd

Ik gebruik de arduino om met behulp van timer 1 een 100 kHz pwd te genereren

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 = bit (WGM13) | bit (WGM12) | bit (CS10);//Set/1 prescaler
   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. 
}

Ik gebruikte dit om de modules te testen:

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");}}

Zender

#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

En het werkt goed, nu is het eerste probleem dat zowel RF24 als de pwm gebruiken de pin 10, maar de bibliotheek stelt je in staat om het te veranderen, dus nu gebruik ik pin 7 in plaats daarvan. Ik heb het opnieuw getest en werkt nog steeds prima.

Maar wanneer ik de regels aan de setup toevoeg om de pwd te gebruiken, werkt de communicatie niet

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

   TCCR1A =  bit(WGM11) | bit(WGM10) | bit(COM1A0) | bit(COM1B1)  ;//Toggle OC1A, Clear on OC1B    
   TCCR1B = bit (WGM13) | bit (WGM12) | bit (CS10);//Set/1 prescaler
   OCR1A  = 159 ;//79;   //Set TOP count to 16000000/(2*PreScaler*Ftoggle)
                         //or 16000000/(PreScaler *Ftimer)
   OCR1B  = 10;          //10/160 duty cycle
   TCNT1 = 0 ;

Ik probeer regel voor regel en het probleem is hier:

TCCR1B = bit (WGM13) | bit (WGM12) | bit (CS10);//Set/1 prescaler

Bij het instellen van de prescaler op 1.

Welke is de afhankelijkheid van de RF24 op deze timer? en welke opties ik moet laten werken

BEWERK.

Nu gebruik ik pins 6 en 7 voor CE en CS Ook "| bit (COM1A0)" is verwijderd uit de registerinstelling

Werkt nog steeds niet

Ik heb dit

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 = bit (WGM13) | bit (WGM12) | bit (CS10);//Set/1 prescaler
   TCNT1 = 0 ;

  //// 
 }

Als ik de instellingen voor de PWM vóór de instellingen voor de RF24 zet, werkt de PWM niet, de RF-instellingen in eerste instantie werken niet.

radio.begin() moet de registers overschrijven, maar ik heb niet gevonden hoe.

1
Misschien is het feit dat je pin 10 hebt als PWM de SPI-module in de war brengen waarvoor pin 10 moet worden ingesteld om te worden uitgevoerd zodat SPI kan werken?
toegevoegd de auteur Majenko, de bron
De nRF heeft pin 10 niet nodig, maar de SPI wel. Het is een hardware-ding. Als u de pwm zonder pun 10 kunt uitvoeren, kan dit worden bewezen of weerlegd.
toegevoegd de auteur Majenko, de bron
De "TCCR1A = bit (WGM11) | bit (WGM10) | bit (COM1A0) | bit (COM1B1);//Toggle OC1A, Clear op OC1B" lijn stelt de PWM in om zowel de OC1A als de OC1B pins te besturen, die 9 zijn en 10 op een Arduino Uno, verstoort Pin 9 de RF24 via de "RF24-radio (9,10 \\ 7);" lijn? Als dat het geval is, kunt u het gedeelte "| bit (COM1A0)" verwijderen om pen 9 vrij te maken voor digitale IO in plaats van PWM.
toegevoegd de auteur Dave X, de bron
@DaveX Ik probeer het, werkt nog steeds niet
toegevoegd de auteur Luis Ramon Ramirez Rodriguez, de bron
@Majenko als de RF24 geen gebruik hoeft te maken van pin 10, hoe kan ik controleren of de SPI-bibliotheek het probleem veroorzaakt
toegevoegd de auteur Luis Ramon Ramirez Rodriguez, de bron

1 antwoord

Misschien is het goed om 100kHz PWM met timer2 te doen in plaats van timer1. De registers lijken op timer1, maar ze zijn slechts 8 bit, dus je kunt niet groter worden dan 255 in de vergelijkings- en telregisters. De prescaler zou hetzelfde zijn en de timergestuurde pinnen zouden D11 en D3 zijn:

  //// 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 ;

Ik heb dit niet getest op een Uno/Atmega328P, maar het ziet er redelijk uit volgens de datasheet (p153-157) .

Als u niet zowel de 50kHz-toggle als de 100kHz PWM-outputs wilt hebben (zoals in uw geposte code), kunt u de ene of de andere uitschakelen en de frequentie naar behoefte aanpassen.

1
toegevoegd