Generera 3-4MHz ut från Arduino eller Pi Pico?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Bigstone
Inlägg: 582
Blev medlem: 22 september 2004, 13:04:12
Ort: Linköping

Generera 3-4MHz ut från Arduino eller Pi Pico?

Inlägg av Bigstone »

Undrar om det går att generera en fyrkantsvåg på mellan 3 till 4 MHz ut från en Atmega 328 eller Pi Pico?

Ska bygga sk. "Rävar" till en amatörradioklubb och vill göra det så enkelt som möjligt. Visst går det att använda en Si5351a eller en kristall oscillator men det blir lite mer kostsamt och mer komponenter men går det inte på annat sätt så...
Ett bandpassfilter blir det för att bli av med övertonerna men i övrigt ska den vara enkel med ett par mW ut, ska inte spridas ut över något större område.
(Frekvensen är tänkt att vara mellan 3.5-3.6 MHz inom cw området.)
Har sett att detta görs med Raspberry Pi's (Zero, pi3 mfl.) men är lite för saftiga priser på de korten idag och känns lite overkill.

Tps, idéer och länkar mottages tacksamt. :)

73 de SA5VOX
TheUnreal
Inlägg: 115
Blev medlem: 4 september 2005, 16:04:57
Ort: Sundsvall
Kontakt:

Re: Generera 3-4MHz ut från Arduino eller Pi Pico?

Inlägg av TheUnreal »

Utan att ha någon form av bevis säger jag att det ska gå ;)

Picon's PIO ska kunna drivas med klocka upp till 125 MHz, om man då bara togglar en port on/off borde det ge en frekvens på 62,5 MHz.


Edit: Dock vet jag inte hur temperaturstabil en Pico's klocka är :)
metric
Inlägg: 766
Blev medlem: 16 maj 2010, 11:04:52

Re: Generera 3-4MHz ut från Arduino eller Pi Pico?

Inlägg av metric »

Kan det bli enklare ?
http://www.sparkbangbuzz.com/easy-ten/easy-ten.htm
Sen kan du nyckla den med en Arduino.
Användarvisningsbild
Bigstone
Inlägg: 582
Blev medlem: 22 september 2004, 13:04:12
Ort: Linköping

Re: Generera 3-4MHz ut från Arduino eller Pi Pico?

Inlägg av Bigstone »

TheUnreal skrev: 2 september 2022, 21:53:20 Utan att ha någon form av bevis säger jag att det ska gå ;)

Picon's PIO ska kunna drivas med klocka upp till 125 MHz, om man då bara togglar en port on/off borde det ge en frekvens på 62,5 MHz.


Edit: Dock vet jag inte hur temperaturstabil en Pico's klocka är :)
Det är exakt det jag letade efter! TACK! :)
Hittade även ett bibliotek för Arduino igår kväll: FastPwmPin https://github.com/maxint-rd/FastPwmPin som gör samma sak. Klarar tydligen upp till 16MHz med lite tur.

Nu ska labbas lite och bygga filter! :)
Användarvisningsbild
Bigstone
Inlägg: 582
Blev medlem: 22 september 2004, 13:04:12
Ort: Linköping

Re: Generera 3-4MHz ut från Arduino eller Pi Pico?

Inlägg av Bigstone »

metric skrev: 4 september 2022, 15:21:45 Kan det bli enklare ?
http://www.sparkbangbuzz.com/easy-ten/easy-ten.htm
Sen kan du nyckla den med en Arduino.
Njae, egentligen inte, väldigt enkelt och man kan använda en kristall för NTSC color burst så ligger man hyfsat bra, idén har redan föresvävat mig men att kunna ändra frekvensen utan att behöva byta kristaller eller ha extra vridkondensatorer mm. och slippa tjirp sändningar vore så smidigt och om det gick att göra i stort sett digitalt är det ju drömmen med många möjligheter därefter. :)
Men tack snälla för tipset!
Användarvisningsbild
Bigstone
Inlägg: 582
Blev medlem: 22 september 2004, 13:04:12
Ort: Linköping

Re: Generera 3-4MHz ut från Arduino eller Pi Pico?

Inlägg av Bigstone »

Testar att använda FastPwmPin biblioteket men har ett problem, kan banne mig inte få den att byta frekvens. 4MHz punkt slut.
Vad är det jag missar?
(Använder en UNO med 16MHz kristall.)

Kod: Markera allt

/*
  Blink with fast PWM pin
  Turns on an LED on and off, repeatedly, along with fast toggle of a specific pin.
  For more information see https://github.com/maxint-rd/FastPwmPin

  Most Arduinos have an on-board LED you can control. On the UNO, MEGA and ZERO 
  it is attached to digital pin 13, on MKR1000 on pin 6. LED_BUILTIN is set to
  the correct LED pin independent of which board is used.
  If you want to know what pin the on-board LED is connected to on your Arduino model, check
  the Technical Specs of your board  at https://www.arduino.cc/en/Main/Products
  For ATtiny85 and ATtiny13A the library set LED_BUILTIN to pin 2.
  
  This example code is based on the Arduino Blink example, released in the public domain.
  Original version modified by Scott Fitzgerald, Arturo Guadalupi & Colby Newman.
  This version modified 17 January 2018 by Maxint R&D (github.com/maxint-rd)
*/

#include <FastPwmPin.h>

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);

  // Enable fast PWM on a pin
  // ATmega328/168 (Uno/Nano/Pro Mini): pin D3 or pin D11 (D11 toggle only)
  // ATtiny85: pin D1, D4 (D0/D3 only as inverted for D1/D4, 51%-99%)
  // ATtiny13A: pin D1, D0 (D0 toggle only)
  FastPwmPin::enablePwmPin(9, 3540000L, 50);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(500);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(500);                       // wait for a second
}
j_tomas
Inlägg: 30
Blev medlem: 25 november 2011, 21:53:34

Re: Generera 3-4MHz ut från Arduino eller Pi Pico?

Inlägg av j_tomas »

Vad är det jag missar?
Biblioteket använder timers i mikroprocessorn för att generera signalen. Det gör att klockan bara kan delas ner med heltal, så du kan inte styra den i små steg för att få 3540 kHz.

En Si5351 rekommenderas till rävsändaren.
Användarvisningsbild
Bigstone
Inlägg: 582
Blev medlem: 22 september 2004, 13:04:12
Ort: Linköping

Re: Generera 3-4MHz ut från Arduino eller Pi Pico?

Inlägg av Bigstone »

Check, insett det, får nog bli Si5351a iaf.men verkar som om Pi Pico gå att tweaka rätt enkelt också, ska ge det ett försök. Görs ju samma saker med Pi Zero mfl..
Användarvisningsbild
Bigstone
Inlägg: 582
Blev medlem: 22 september 2004, 13:04:12
Ort: Linköping

Re: Generera 3-4MHz ut från Arduino eller Pi Pico?

Inlägg av Bigstone »

Kan inte riktigt överge tanken efter att jag fått ett förslag till lösning på Arduino forumet men har inte fått det att fungera riktigt.
Försökt nå den som gav förslaget men inte fått något svar.
Är det någon som har koll på Pico och hur man får detta att rulla? (Använder Arduino IDE):

Kod: Markera allt

 
//For Earl Philhower core (default board frequency 133 MHz)

// PWM timer config
#define PWM_WRAP 38    // timer period 133 MHz / 38 = 3.5 MHz
pwm_config c_OE = pwm_get_default_config();
pwm_config_set_clkdiv(&c_OE, 1);                         // prescaler 1
pwm_config_set_wrap(&c_OE, PWM_WRAP-1);
pwm_config_set_output_polarity(&c_OE, false, false);   // not invert A & B outputs 
// PWM pin config
uint8_t OE_slice_num = pwm_gpio_to_slice_num(pin_OE); 
gpio_set_function(pin_OE, GPIO_FUNC_PWM);
pwm_set_gpio_level(pin_OE, PWM_WRAP / 2);      // duty 50%
pwm_init(OE_slice_num, &c_OE, true);         // start PWM timer

Får följande felmeddelande:
Arduino:1.8.19 (Windows 10), Kort:"Raspberry Pi Pico, 2MB (no FS), 133 MHz, Small (-Os) (standard), Disabled, Disabled, Disabled, Disabled, None, Pico SDK, IPv4 Only"

sketch_oct02a:3:1: error: 'pwm_config' does not name a type; did you mean 'pio_sm_config'?

3 | pwm_config c_OE = pwm_get_default_config();

| ^~~~~~~~~~

| pio_sm_config

sketch_oct02a:4:22: error: expected constructor, destructor, or type conversion before '(' token

4 | pwm_config_set_clkdiv(&c_OE, 1); // prescaler 1

| ^

sketch_oct02a:5:20: error: expected constructor, destructor, or type conversion before '(' token

5 | pwm_config_set_wrap(&c_OE, PWM_WRAP-1);

| ^

sketch_oct02a:6:31: error: expected constructor, destructor, or type conversion before '(' token

6 | pwm_config_set_output_polarity(&c_OE, false, false); // not invert A & B outputs

| ^

sketch_oct02a:8:46: error: 'pin_OE' was not declared in this scope

8 | uint8_t OE_slice_num = pwm_gpio_to_slice_num(pin_OE);

| ^~~~~~

sketch_oct02a:8:24: error: 'pwm_gpio_to_slice_num' was not declared in this scope

8 | uint8_t OE_slice_num = pwm_gpio_to_slice_num(pin_OE);

| ^~~~~~~~~~~~~~~~~~~~~

sketch_oct02a:9:18: error: expected constructor, destructor, or type conversion before '(' token

9 | gpio_set_function(pin_OE, GPIO_FUNC_PWM);

| ^

sketch_oct02a:10:19: error: expected constructor, destructor, or type conversion before '(' token

10 | pwm_set_gpio_level(pin_OE, PWM_WRAP / 2); // duty 50%

| ^

sketch_oct02a:11:9: error: expected constructor, destructor, or type conversion before '(' token

11 | pwm_init(OE_slice_num, &c_OE, true); // start PWM

| ^

exit status 1

'pwm_config' does not name a type; did you mean 'pio_sm_config'?

This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.
Gjorde en version på rent "känn" och som kompilerar och laddar på men inte helt 100% på det jag gjort blev rätt:

Kod: Markera allt

#include "pico/stdlib.h"
#include "hardware/pwm.h"

// PWM timer config
#define PWM_WRAP 38    // timer period 133 MHz / 38 = 3.5 MHz
uint pin_OE = 16;
const int ledPin =  25;

void setup() 
{
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, HIGH);  // Turns on built in LED to show that the PICO is active.
}

void loop()
{
// PWM pin config
gpio_set_function(pin_OE, GPIO_FUNC_PWM);
pwm_config c_OE = pwm_get_default_config();
pwm_config_set_clkdiv(&c_OE, 1);                         // prescaler 1
pwm_config_set_wrap(&c_OE, PWM_WRAP-1);
pwm_config_set_output_polarity(&c_OE, false, false);   // not invert A & B outputs 
uint8_t OE_slice_num = pwm_gpio_to_slice_num(pin_OE); 
pwm_set_gpio_level(pin_OE, PWM_WRAP / 2);      // duty 50%
pwm_init(OE_slice_num, &c_OE, true);         // start PWM timer
}
Skriv svar