ArjanteMarvelde 2021-12-06 13:47:19 +01:00
commit 99f35f9c1d
2 zmienionych plików z 17 dodań i 17 usunięć

Wyświetl plik

@ -5,8 +5,8 @@ Furthermore, the repository contains the electronic design of some modules that
Please see the doc folder for a full description.
The platform used is a Pi Pico module with an RP2040 processor. This processor has dual cores, running at 125MHz each and very configurable I/O, which eases the HW design.
The software is distributed over the two cores: core-0 takes care of all user I/O and control functions, while core-1 performs all of the signal processing. The core-1 functionality consists of a TX-branch and an RX-branch, each called from a function that waits for inter-core FIFO words popping out. This happens every 16usec, because on core-0 a 16usec timer callback ISR pushes the RX/TX status into that FIFO. Hence the signal processing rythm on core-1 effectively is 62.5kHz.
On core-1 the three ADC channels are continuously sampled at maximum speed in round-robin mode. Samples are therefore taken every 6usec for each channel, maximum jitter between I and Q channels is 4usec, which has a negligible effect in the audio domain.
The software is distributed over the two cores: *core0* takes care of all user I/O and control functions, while *core1* performs all of the signal processing. The *core1* functionality consists of a TX-branch and an RX-branch, each called from a function that waits for inter-core FIFO words popping out. This happens every 16usec, because on *core0* a 16usec timer callback ISR pushes the RX/TX status into that FIFO. Hence the signal processing rythm on *core1* effectively is 62.5kHz.
On *core1* the three ADC channels are continuously sampled at maximum speed in round-robin mode. Samples are therefore taken every 6usec for each channel, maximum jitter between I and Q channels is 4usec, which has a negligible effect in the audio domain.
The TX-branch
- takes latest audio audio sample input from ADC2 (rate = 62.5 kHz),
@ -16,18 +16,18 @@ The TX-branch
- scales, filters and outputs I and Q samples on PWM based DACs, towards QSE output
The RX-branch
- takes latest I and Q samples from QSD on ADC0 and ADC1 (rate = 62.5 kHz)
- takes latest Q and I samples from QSD on ADC0 and ADC1 (rate = 62.5 kHz)
- applies a low-pass filter at Fc=3kHz,
- reduces sampling by 4 to get better low frequency response Hilbert xform (rate = 15.625 kHz),
- demodulates:
- demodulates, e.g. SSB:
-- applies 15-tap DHT on Q channel and 7 sample delay on I channel
-- subtracts I and Q samples
- scales, filters and outputs audio on an PWM based DAC, towards audio output
On core0 the main loop takes care of user I/O, all other controls and the monitor port. There is also a LED flashing timer callback functioning as a heartbeat.
On *core0* the main loop takes care of user I/O, all other controls and the monitor port. There is also a LED flashing timer callback functioning as a heartbeat.
The Pico controls an Si5351A clock module to obtain the switching clock for the QSE and QSD. The module outputs two synchronous square wave clocks on ch 0 and 1, whith selectable phase difference (0, 90, 180 or 270 degrees). The clock on ch2 is free to be used for other goals. The module is controlled over the **i2c1** channel.
The display is a standard 16x2 LCD, but with an I2C interface. The display is connected through the **i2c0** channel.
The Pico controls an Si5351A clock module to obtain the switching clock for the QSE and QSD. The module outputs two synchronous square wave clocks on ch 0 and 1, whith selectable phase difference (0, 90, 180 or 270 degrees). The clock on ch2 is free to be used for other goals. The module is controlled over the **i2c0** channel.
The display is a standard 16x2 LCD, but with an I2C interface. The display is connected through the **i2c1** channel, as well as the bus expanders for controlling the various relays.
## Open issues:
- [x] take care of processing cycles, by moving signal processing parts to the second core
@ -39,23 +39,23 @@ The display is a standard 16x2 LCD, but with an I2C interface. The display is co
- [x] SW based VOX
- [ ] implement RSSI
- [x] design a set of PCBs
- [ ] sort out the new HW modules
- [x] sort out the new HW modules
- [ ] improve speed: better dual-core management for memory and timer
- [ ] add control for new HW: BPF and pre-amp/attenuator switching
- [x] add control for new HW: BPF and pre-amp/attenuator switching
## Installing and using the SDK for Windows:
Please refer to https://github.com/ndabas/pico-setup-windows/releases where the latest installer can be downloaded (e.g. **pico-setup-windows-0.3-x64.exe**).
Execute the installer to set up the SDK environment, e.g. in **~/Documents/Pico** (let's call this folder $PICO).
Execute the installer to set up the SDK environment, e.g. in **~/Documents/Pico** (let's call this folder **$PICO**).
## Building uSDR-pico:
Clone/copy the uSDR-pico code files into a subdirectory, e.g. **$PICO/uSDR-pico**
Create the build folder: **$PICO/uSDR-pico/build**
Before doing any building you need to adapt the file **$PICO/uSDR-pico/CMakeLists.txt**, using your favourite browser, to reflect your own directory structure. Also, select whether you want **stdio** to use the UART on pins 1 and 2 or the USB serial port. The monitor terminal is on **stdio**.
In **$PICO/** you will find a command to start a Developer Command Prompt window. Within this DCP all environment settings are initialized to enable building.
In the DCP window, chdir to the build folder and execute: **cmake -G "NMake Makefiles" ..**
Now you have initialized the make environment, and by executing **nmake** in that same build folder, the Pi Pico loadable file **uSDR.uf2** is created.
Rebooting the Pico while the bootsel button is pressed will open a file explorer window with the Pico as a Mass Storage Device. Moving the binary to the Pico is as easy as dragging and dropping this uf2 file into that MSD.
Before doing any building you need to adapt the file **$PICO/uSDR-pico/CMakeLists.txt**, using your favourite editor, to reflect your own directory structure. Also, select whether you want **stdio** to use the UART on pins 1 and 2 or the USB serial port. The monitor terminal is on **stdio**.
In **$PICO/** you will find a command to start a Developer Command Prompt (*DCP*, like a "DOS box"), make sure to use this one instead of any other DOS box. Within this *DCP* all environment settings have been properly pre-set to enable building.
In the *DCP* window, chdir to the **build** folder and execute: **cmake -G "NMake Makefiles" ..** (do not forget the trailing dots).
Now you have initialized the make environment (for *nmake*) and by executing **nmake** in that same **build** folder, all SDK libraries and finally the Pi Pico loadable file **uSDR.uf2** will be created.
Rebooting the Pico while the bootsel button is pressed will open a file explorer window with the Pico shown as a Mass Storage Device (e.g. drive E:). Moving the binary to the Pico is as easy as dragging and dropping this uf2 file into that MSD.
# Background
The folder **$PICO/docs** also contains some manuals, of which the *C-SDK description*, the *RP2040 datasheet* and the *Pico Pinout* are absolute must-reads when you start writing software.
@ -63,7 +63,7 @@ For calculating filters I have used the free software from Iowa Hills (http://ww
I also used the online FIR filter calculator T-Filter (http://t-filter.engineerjs.com/)
# Copyright notice
The code and electronic designs as well as the implementations presented in this reposiory can be copied and modified freely, for non-commercial use.
Use for commercial purposes is allowed as well, as long as a reference to this repository is included in the product.
**The code and electronic designs as well as the implementations presented in this repository can be copied and modified freely, for non-commercial use.
Use for commercial purposes is allowed as well, as long as a reference to this repository is included in the product.**

Plik binarny nie jest wyświetlany.