picoのコンパイルは通常、cmake -> make を使います。cmake を行うにはCMakeLists.txt が必要です。しかしこのCMakeLists.txtを作成することはなかなか成功せず、こつが必要です。 Pico Project Generator は PicoのCMakeList.txtを含むプロジェクトのテンプレートを作成してくれます。
https://github.com/raspberrypi/pico-project-generator
GuthubからZipファイルをダウンロードします。

pico-project-generator-master.zipというファイルがダウンロードされます。 これを展開するとpico-project-generator-masterというフォルダができます。
私はMac OS14で作業しています。ターミナルアプリを開きpico-project-generator-masterへ移動します。 Pico Project Generatorは以下のPython3を使って以下のコマンドで動作します。
pico-project-generator-master > python3 pico_project.py --gui
しかし、Pico Project Generatorを動作させるには、Python3.12.xが必要です。 少なくともPython3.6.9ではGUIが真っ白になりました。

Pythonの最新版はこちらからダウンロードできます。
https://www.python.org/downloads/

ダウンロードしたpython-3.12.4-macos11.pkgをダブルクリックすることでインストールができます、
|
|
|
|
|
|
|
|
pythonのバージョンを確認します。インストールしたバージョンを同じであればOKです。
> python3 -V Python 3.12.4
もう一つ、Pico Project Generatorを動作されるには、tkinterというpythonのGUIを表示するモジュールが必要です。 Tkinter は通常は Python に含まれています。
> python3 -m tkinter
このコマンドで以下のようなウィンドウが開けばOKです。

もう一度pico-project-generatorを起動します。
pico-project-generator-master > python3 pico_project.py --gui

Project Nameに"pico_test"を入力し、Console Over USBにチェックを入れ、画面下の赤文字の”OK”を押します。 下図のようなcmakeのダイアログを表示されます。

cmakeダイアログの"OK"を押すとpico-project-generator-masterの下にpico_testフォルダができています。
pico-project-generator-master/pico_test > ls CMakeLists.txt pico_sdk_import.cmake build pico_test.c
次のコマンドでコンパイルできます。
pico-project-generator-master/pico_test > cd build pico-project-generator-master/pico_test/build > cmake .. pico-project-generator-master/pico_test/build > make
成功すればpico_test.uf2がbuikdの下にできています。
pico-project-generator-master/pico_test/build > ls CMakeCache.txt generated pico_test.elf.map CMakeFiles pico-sdk pico_test.hex Makefile pico_test.bin pico_test.uf2 cmake_install.cmake pico_test.dis pioasm elf2uf2 pico_test.elf
Raspberry Pi PicoのPWMの使い方を説明します。Picoは16bitのカウンターでPWM波形を生成します。 カウンターはPicoのクロック周期(8 nanosecond, nsecと記述します。)で1づつ増加します。 16bitなので、カウンターの値が65536に達するとゼロに戻ります。 このでできるノコギリ波の周期は8nsec x 65536 = 524,288 nsecとなり、周波数では約1,907Hzとなります。

PWM波形を作るには、この0から65535までの値を繰り返しているカウンターをあるレベルで切り取ります。 このレベルをchan_levelと書くことにします。 カウンターの値がchan_level以下では1を、カウンターの値がchan_levelを超えると0となるような出力を作ります。 この出力波形がPWM波形です。 PWM波形はいずれかのPWMがアサインされているピンの出力を観察することで、1の時3Vが、0の時0Vが出力されます。 下の図の場合は、Chan_levelが32768の場合です。この値はカウンターの値のちょうど真ん中ですので 得られるPWM波形は0vと3vが同じ長さの矩形波となります。

chan_levelが16384であれば、下図のように1になっている時間が、0となっている時間の1/3になります。

実際にこのような波形が出力されるかどうか、プログラムを作成します。 ここではGPIO0とGPIO1の2つのGPIOを主力として使っています。
#include "pico/stdlib.h"
#include "hardware/pwm.h"
int main() {
gpio_set_function(0, GPIO_FUNC_PWM);
gpio_set_function(1, GPIO_FUNC_PWM);
uint slice_num = pwm_gpio_to_slice_num(0);
pwm_set_wrap(slice_num, 65535);
pwm_set_chan_level(slice_num, PWM_CHAN_A, 32768);
pwm_set_chan_level(slice_num, PWM_CHAN_B, 16384);
pwm_set_enabled(slice_num, true);
while(1){}
}
CMakeList.txtは以下のようになります。
# Generated Cmake Pico project file
cmake_minimum_required(VERSION 3.13)
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)
# Initialise pico_sdk from installed location
# (note this can come from environment, CMake cache etc)
set(PICO_SDK_PATH $ENV{PICO_SDK_PATH})
set(PICO_BOARD pico CACHE STRING "Board type")
# Pull in Raspberry Pi Pico SDK (must be before project)
include(pico_sdk_import.cmake)
if (PICO_SDK_VERSION_STRING VERSION_LESS "1.4.0")
message(FATAL_ERROR "Raspberry Pi Pico SDK version 1.4.0 (or later) required. Your version is ${PICO_SDK_VERSION_STRING}")
endif()
set(Proj PWM_TEST)
project(${Proj} 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(${Proj} PWM_TEST.c)
pico_set_program_name(${Proj} "PWM_TEST")
pico_set_program_version(${Proj} "0.1")
pico_enable_stdio_uart(${Proj} 0)
pico_enable_stdio_usb(${Proj} 1)
# Add the standard include files to the build
target_include_directories(${Proj} PRIVATE
${CMAKE_CURRENT_LIST_DIR}
${CMAKE_CURRENT_LIST_DIR}/.. # for our common lwipopts or any other standard includes, if required
${PICO_SDK_PATH}/src/rp2_common/hardware_pwm/include
)
# Add any user requested libraries
target_link_libraries(${Proj} pico_stdlib hardware_pwm)
pico_add_extra_outputs(${Proj})
GPIO0とGPIO1の波形を下に示します。
| chan_level=32768 | chan_level=16384 |
|
|