Pi Pico Rx - 公開プログラムnco_pioを使って、Raspberry Pi Picoのシステムクロックからメイン処理と独立したPIO制御による7MHz90度位相差クロックの出力テストを行いました。
※開発環境はVisual Studio Code 拡張機能 の【Raspberry Pi Pico】
●Pi Pico Rx
ダイレクトコンバージョン受信機の直交ミキサ局発は測定波形と同様に位相差90度です。Raspberry Pi PicoシステムクロックからPIO制御による7MHz局発IとQが作れることが確認できました。
参考サイト
●101 Things
Pi Pico Rx
●RP2040 Datasheet
【https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf】
●Raspberry Pi Pico C/C++ PIOでポート出力してみる
●【Arduino】Raspberry Pi Pico/W のPIOでウィンカー点滅を再現するぞ!(PIO : Lチカ)
pio_ncoプロジェクト
【New C/C++ Project】
【Name】pio_nco
【board type】Pico
【フォルダーは任意】
【PIO Interface】レ点
【Create】
pio_ncoフォルダ
ファイル名
【blink】 → 【nco】に変更
ファイル内のコードを書替
【nco.pio】と【pio_nco.c】
ファイルを下記ブログラムに書替える。
CMakeLists.txt
【blink.pio】→【nco.pio】に変更する。
コンパイル
pio_ncoフォルダ
【pio_nco.uf2】を【RPI-RP2】にドラッグ・アンド・ドロップ(書込み・実行)
90度位相差クロック測定
周波数カウンタ測定
●システムクロック125MHz
出力周波数(7.000.000)
→GPIO0【6.999.136】Hz
●システムクロック133MHz
出力周波数(7.000.000)
→GPIO0【7.000.007】Hz
nco.pioファイル
set pins0~3を個別に実行した結果
GPIO出力 0→0V 1→3.3V
GPIO 1 GPIO 0
set pins, 0 0 0
set pins, 1 0 1
set pins, 3 1 1
set pins, 2 1 0
GPIO0・GPIO1位相差90度
set pins 0 1 3 2 0 1 3 2 0 1 3 2 0 1 3 2
GPIO 0 _| ̄ ̄|__| ̄ ̄|__| ̄ ̄|__| ̄ ̄|_
GPIO 1 __| ̄ ̄|__| ̄ ̄|__| ̄ ̄|__| ̄ ̄|
7MHzの出力
システムクロック: 133MHz(任意)
出力周波数: 7MHz
命令サイクル: 4サイクル
divider(クロック分周値)= システムクロック ÷(出力周波数 × 4サイクル)
クロック分周の設定:pio_sm_set_clkdiv(pio, sm, divider)
pio_nco.c
#include "hardware/clocks.h"
#include "pico/stdlib.h"
#include "hardware/pio.h"
#include "nco.pio.h"
int main()
{
//set_sys_clock_hz(125000000, true); //1MHz単位で変更可能
//set_sys_clock_pll(12000000*125, 6, 2); //システムクロック125000000Hz
set_sys_clock_pll(12000000*133, 6, 2); //システムクロック133000000Hz
float system_clock_frequency = 133000000; //システムクロック
PIO pio = pio0; //pioを指定
uint sm;
uint offset = pio_add_program(pio, &nco_program); //offset変数←アセンブラのアドレス
nco_program_init(pio, sm, offset); //PIOの初期化
float adjusted_frequency = 7000000; //クロック周波数設定
float divider = system_clock_frequency/(4 * adjusted_frequency); //周波数分周
pio_sm_set_clkdiv(pio, sm, divider); //クロック出力
}
nco.pio
.program nco
set pins, 0
set pins, 1 ; Drive pin low
set pins, 3 ; Drive pin high
set pins, 2 ; Drive pin low
% c-sdk {
static inline void nco_program_init(PIO pio, uint sm, uint offset) {
// PIOステートマシンコンフィグのデフォルト値を取得
pio_sm_config c = nco_program_get_default_config(offset);
// Map the state machine's OUT pin group to one pin, namely the `pin`
// parameter to this function.
//ピンと、ピンの数を指定
sm_config_set_set_pins(&c, 0, 2);
// Set this pin's GPIO function (connect PIO to the pad)
//GPIOをPIO 0に割り当てる
pio_gpio_init(pio, 0);
//GPIOをPIO 1に割り当てる
pio_gpio_init(pio, 1);
//出力電流2mA
gpio_set_drive_strength(0, GPIO_DRIVE_STRENGTH_2MA);
gpio_set_drive_strength(1, GPIO_DRIVE_STRENGTH_2MA);
//スルーレート 遅い
gpio_set_slew_rate(0, GPIO_SLEW_RATE_SLOW);
gpio_set_slew_rate(1, GPIO_SLEW_RATE_SLOW);
// Set the pin direction to output at the PIO
//PIOでピンの方向を出力に設定する
pio_sm_set_consecutive_pindirs(pio, sm, 0, 2, true);
//set pio divider
//クロック周波数分周 1
sm_config_set_clkdiv(&c,1);
// Load our configuration, and jump to the start of the program
//プログラムを読込、先頭から実行
pio_sm_init(pio, sm, offset, &c);
// Set the state machine running
//PIOステートマシンを有効にする
pio_sm_set_enabled(pio, sm, true);
}
%}
# Generated Cmake Pico project file
cmake_minimum_required(VERSION 3.13)
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
# Initialise pico_sdk from installed location
# (note this can come from environment, CMake cache etc)
# == DO NOT EDIT THE FOLLOWING LINES for the Raspberry Pi Pico VS Code Extension to work ==
if(WIN32)
set(USERHOME $ENV{USERPROFILE})
else()
set(USERHOME $ENV{HOME})
endif()
set(sdkVersion 2.1.0)
set(toolchainVersion 13_3_Rel1)
set(picotoolVersion 2.1.0)
set(picoVscode ${USERHOME}/.pico-sdk/cmake/pico-vscode.cmake)
if (EXISTS ${picoVscode})
include(${picoVscode})
endif()
# ====================================================================================
set(PICO_BOARD pico CACHE STRING "Board type")
# Pull in Raspberry Pi Pico SDK (must be before project)
include(pico_sdk_import.cmake)
project(pio_nco C CXX ASM)
# Initialise the Raspberry Pi Pico SDK
pico_sdk_init()
# Add executable. Default name is the project name, version 0.1
add_executable(pio_nco pio_nco.c )
pico_set_program_name(pio_nco "pio_nco")
pico_set_program_version(pio_nco "0.1")
# Generate PIO header
pico_generate_pio_header(pio_nco ${CMAKE_CURRENT_LIST_DIR}/nco.pio)
# Modify the below lines to enable/disable output over UART/USB
pico_enable_stdio_uart(pio_nco 0)
pico_enable_stdio_usb(pio_nco 0)
# Add the standard library to the build
target_link_libraries(pio_nco
pico_stdlib)
# Add the standard include files to the build
target_include_directories(pio_nco PRIVATE
${CMAKE_CURRENT_LIST_DIR}
)
# Add any user requested libraries
target_link_libraries(pio_nco
hardware_pio
)
pico_add_extra_outputs(pio_nco)
0 件のコメント:
コメントを投稿