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.