2025年3月1日土曜日

Pi Pico (RP2040) PIO - VSCode 90度位相差クロック出力


Pi Pico Rx - 公開プログラムnco_pioを使って、Raspberry Pi Picoのシステムクロックからメイン処理と独立したPIO制御による7MHz90度位相差クロックの出力テストを行いました。
※開発環境はVisual Studio Code 拡張機能 の【Raspberry Pi Pico】
●Pi Pico Rx
 

上ーGPIO0 下ーGPIO1 (7MHz)


ダイレクトコンバージョン受信機の直交ミキサ局発は測定波形と同様に位相差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度位相差クロック測定
上ーGPIO0 下ーGPIO1 (7MHz)



















周波数カウンタ測定
●システムクロック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);
}

%}


CMakeLists.txt
# 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 件のコメント:

コメントを投稿

Pi Pico (RP2040) PIO - VSCode 90度位相差クロック出力

Pi Pico Rx - 公開プログラムnco_pioを使って、Raspberry Pi Picoのシステムクロックからメイン処理と独立したPIO制御による7MHz90度位相差クロックの出力テストを行いました。 ※開発環境はVisual Studio Code 拡張機能 の【Ra...