一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

【CW32模塊使用】雙軸按鍵搖桿模塊

CW32生態(tài)社區(qū) ? 來源:CW32生態(tài)社區(qū) ? 作者:CW32生態(tài)社區(qū) ? 2025-03-29 17:23 ? 次閱讀

雙軸按鍵游戲搖桿模塊,采用 PS2游戲手柄上金屬按鍵搖桿電位器。模塊特設(shè)二路模擬輸出和一路數(shù)字輸出接口、輸出值分別對(duì)應(yīng)(X、Y)雙軸偏移量、其類型為模擬量、按鍵表示用戶是否在Z軸上按下、其類型為數(shù)字開關(guān)量、用其可以輕松控制物體,在二維空間運(yùn)動(dòng)、因此可以通控制器編程、傳感器擴(kuò)展板插接、完成具有創(chuàng)意性遙控互動(dòng)作品。

一、模塊來源

模塊實(shí)物展示:

wKgZPGflMoWASaIXAAAZ8BIZGZw925.jpg

二、規(guī)格參數(shù)

驅(qū)動(dòng)電壓:3.3V~5V

控制方式:ADC+GPIO

以上信息見廠家資料文件

三、移植過程

我們的目標(biāo)是將例程移植至CW32F030C8T6開發(fā)板上【能夠控制電機(jī)旋轉(zhuǎn)速度的功能】。首先要獲取資料,查看數(shù)據(jù)手冊(cè)應(yīng)如何實(shí)現(xiàn)讀取數(shù)據(jù),再移植至我們的工程。

3.1查看資料

輸出信號(hào):模塊特設(shè)二路模擬輸出(VRX,VRY)和一路數(shù)字輸出接口(SW),二路模擬輸出值分別對(duì)應(yīng)(X,Y)雙軸偏移量,其類型為模擬量;按鍵表示用戶是否在Z軸上按下,其類型為數(shù)字開關(guān)量。

十字搖桿為一個(gè)雙向的10K電阻器,隨著搖桿方向不同,抽頭的阻值隨著變化。本模塊如果使用5V供電,原始狀態(tài)下X,Y讀出電壓為2.5V左右,當(dāng)隨箭頭方向按下,讀出電壓值減少,限小為0V。

3.2引腳選擇

VRX與VRY使用ADC功能。

想要使用ADC,需要確定使用的引腳是否有ADC外設(shè)功能。

當(dāng)前只有AO引腳需要使用到ADC接口,所以DO引腳可以使用開發(fā)板上其他的GPIO。這里選擇使用PA1和PA2的附加ADC功能。使用ADC的第1道和2通道。

wKgZO2flMoWASIekAAClLFymW44730.jpg

ADC功能引腳

wKgZPGflMoaAPw8FAADqpBXA0lw421.jpg

模塊接線圖

3.3移植至工程

移植步驟中的導(dǎo)入.c和.h文件與【CW32模塊使用】DHT11溫濕度傳感器相同,只是將.c和.h文件更改為bsp_joystick.c與bsp_joystick.h。這里不再過多講述,移植完成后面修改相關(guān)代碼。

在文件bsp_joystick.c中,編寫如下代碼。

/*
 * Change Logs:
 * Date           Author       Notes
 * 2024-06-21     LCKFB-LP    first version
 */

#include "drv_spi.h"



/** 硬件SPI */
#define SPI_WAIT_TIMEOUT       ((uint16_t)0xFFFF)

/**
  * @brief :SPI初始化(硬件)
  * @param :無
  * @note  :無
  * @retval:無
  */
void drv_spi_init( void )
{
        GPIO_InitTypeDef GPIO_InitStruct1;             // GPIO初始化結(jié)構(gòu)體
        GPIO_InitTypeDef GPIO_InitStruct2;             // GPIO初始化結(jié)構(gòu)體

        SPI_GPIO_RCC();                                // 使能GPIO時(shí)鐘
        RCC_SPI_HARDWARE_ENABLE();                     // 使能SPI1時(shí)鐘

        // GPIO復(fù)用為SPI1
        BSP_SPI_AF_SCK();
        BSP_SPI_AF_MISO();
        BSP_SPI_AF_MOSI();

        GPIO_InitStruct1.Pins = SPI_NSS_GPIO_PIN|
                                                        SPI_CLK_GPIO_PIN|
                                                        SPI_MOSI_GPIO_PIN;      // GPIO引腳
        GPIO_InitStruct1.Mode = GPIO_MODE_OUTPUT_PP;    // 推挽輸出
        GPIO_InitStruct1.Speed = GPIO_SPEED_HIGH;       // 輸出速度高
        GPIO_Init(SPI_GPIO_PORT, &GPIO_InitStruct1);    // 初始化

        GPIO_InitStruct2.Pins = SPI_MISO_GPIO_PIN;      // GPIO引腳
        GPIO_InitStruct2.Mode = GPIO_MODE_INPUT_PULLUP; // 上拉輸入
        GPIO_Init(SPI_GPIO_PORT, &GPIO_InitStruct2);    // 初始化

        spi_set_nss_high();  // 片選拉高

        SPI_InitTypeDef  SPI_InitStructure; // SPI 初始化結(jié)構(gòu)體

        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;    // 雙線全雙工
        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                         // 主機(jī)模式
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                     // 幀數(shù)據(jù)長(zhǎng)度為8bit
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;                            // 時(shí)鐘空閑電平為低
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;                          // 第1個(gè)邊沿采樣
        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                             // 片選信號(hào)由SSI寄存器控制
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;    // 波特率為PCLK的8分頻
        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;                    // 最高有效位 MSB 收發(fā)在前
        SPI_InitStructure.SPI_Speed = SPI_Speed_Low;                          // 低速SPI

        SPI_Init(PORT_SPI, &SPI_InitStructure);   // 初始化
        SPI_Cmd(PORT_SPI, ENABLE);   // 使能SPI1
}

/**
  * @brief :SPI收發(fā)一個(gè)字節(jié)
  * @param :
  * @TxByte: 發(fā)送的數(shù)據(jù)字節(jié)
  * @note  :非堵塞式,一旦等待超時(shí),函數(shù)會(huì)自動(dòng)退出
  * @retval:接收到的字節(jié)
  */
uint16_t drv_spi_read_write_byte( uint8_t TxByte )
{
        uint16_t l_Data = 0;
        uint16_t l_WaitTime = 0;

    while(RESET == SPI_GetFlagStatus(PORT_SPI, SPI_FLAG_TXE))//等待發(fā)送緩沖區(qū)為空
        {
                if( SPI_WAIT_TIMEOUT == ++l_WaitTime )
                {
                        break;                        //如果等待超時(shí)則退出
                }
        }
        l_WaitTime = SPI_WAIT_TIMEOUT / 2;                //重新設(shè)置接收等待時(shí)間(因?yàn)镾PI的速度很快,正常情況下在發(fā)送完成之后會(huì)立即收到數(shù)據(jù),等待時(shí)間不需要過長(zhǎng))
        SPI_SendData(PORT_SPI, TxByte);//發(fā)送數(shù)據(jù)

    while(RESET == SPI_GetFlagStatus(PORT_SPI, SPI_FLAG_RXNE))//等待接收緩沖區(qū)非空
        {
                if( SPI_WAIT_TIMEOUT == ++l_WaitTime )
                {
                                break;                        //如果等待超時(shí)則退出
                }
        }
    l_Data = SPI_ReceiveData(PORT_SPI);//讀取接收數(shù)據(jù)

        return l_Data;                //返回
}

/**
  * @brief :SPI收發(fā)字符串
  * @param :
  * @ReadBuffer: 接收數(shù)據(jù)緩沖區(qū)地址
  * @WriteBuffer:發(fā)送字節(jié)緩沖區(qū)地址
  * @Length:字節(jié)長(zhǎng)度
  * @note  :非堵塞式,一旦等待超時(shí),函數(shù)會(huì)自動(dòng)退出
  * @retval:無
  */
void drv_spi_read_write_string( uint8_t* ReadBuffer, uint8_t* WriteBuffer, uint16_t Length )
{
    spi_set_nss_low( );//拉低片選
        while( Length-- )
        {
                *ReadBuffer = drv_spi_read_write_byte( *WriteBuffer ); //收發(fā)數(shù)據(jù)
                ReadBuffer++;
                WriteBuffer++;                                //讀寫地址加1
        }
    spi_set_nss_high( );//拉高片選
}

在文件bsp_joystick.h中,編寫如下代碼。

/*
 * Change Logs:
 * Date           Author       Notes
 * 2024-06-21     LCKFB-LP    first version
 */

#ifndef __DRV_SPI_H__
#define __DRV_SPI_H__

#include "board.h"


//SPI引腳定義
#define SPI_GPIO_RCC()           __RCC_GPIOA_CLK_ENABLE() // GPIO時(shí)鐘

#define SPI_GPIO_PORT            CW_GPIOA

#define SPI_CLK_GPIO_PIN         GPIO_PIN_5
#define SPI_MISO_GPIO_PIN        GPIO_PIN_6
#define SPI_MOSI_GPIO_PIN        GPIO_PIN_7
#define SPI_NSS_GPIO_PIN         GPIO_PIN_4


#define spi_set_nss_high( )      GPIO_WritePin(SPI_GPIO_PORT, SPI_NSS_GPIO_PIN, GPIO_Pin_SET)   //片選置高
#define spi_set_nss_low( )       GPIO_WritePin(SPI_GPIO_PORT, SPI_NSS_GPIO_PIN, GPIO_Pin_RESET) //片選置低



/******** 硬件SPI修改此次 ********/
#define RCC_SPI_HARDWARE_ENABLE()         __RCC_SPI1_CLK_ENABLE()
#define PORT_SPI                          CW_SPI1

//GPIO AF
#define BSP_SPI_AF_SCK()                  PA05_AFx_SPI1SCK()
#define BSP_SPI_AF_MISO()                 PA06_AFx_SPI1MISO()
#define BSP_SPI_AF_MOSI()                 PA07_AFx_SPI1MOSI()


void drv_spi_init( void );
uint16_t drv_spi_read_write_byte( uint8_t TxByte );
void drv_spi_read_write_string( uint8_t* ReadBuffer, uint8_t* WriteBuffer, uint16_t Length );

#endif

四、移植驗(yàn)證

在自己工程中的main主函數(shù)中,編寫如下。

/*
 * Change Logs:
 * Date           Author       Notes
 * 2024-06-25     LCKFB-LP    first version
 */
#include "board.h"
#include "stdio.h"
#include "bsp_uart.h"
#include "bsp_joystick.h"

int32_t main(void)
{
    board_init();

    uart1_init(115200);

    ADC_Joystick_Init();

    printf("Demo Start.....rn");

    while(1)
    {
        if( Get_SW_state() == 0 )
        {
            printf("按鈕按下!!rn");
        }

        printf("X = [%d]rn",Get_Joystick_Percentage_value(0));
        printf("Y = [%d]rn",Get_Joystick_Percentage_value(1));
        printf("n");

        delay_ms(200);
    }
}

移植現(xiàn)象:移動(dòng)搖桿并且按下,輸出搖桿移動(dòng)的數(shù)據(jù)。

wKgZO2flMoaAB5WCAADi0AsUINE552.jpg

模塊移植成功案例代碼:

鏈接:https://pan.baidu.com/s/1tubySHCtuFABDPQ1RjK40g?pwd=LCKF

提取碼:LCKF

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 模塊
    +關(guān)注

    關(guān)注

    7

    文章

    2771

    瀏覽量

    49050
  • 游戲
    +關(guān)注

    關(guān)注

    2

    文章

    763

    瀏覽量

    26592
  • 按鍵
    +關(guān)注

    關(guān)注

    4

    文章

    225

    瀏覽量

    57891
  • CW32
    +關(guān)注

    關(guān)注

    1

    文章

    232

    瀏覽量

    1037
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    CW32移植Free-RTOS】CW32開發(fā)者扶持計(jì)劃

    CW32配置Free-RTOS全過程,CW32開發(fā)者扶持計(jì)劃
    的頭像 發(fā)表于 04-18 09:38 ?6483次閱讀
    【<b class='flag-5'>CW32</b>移植Free-RTOS】<b class='flag-5'>CW32</b>開發(fā)者扶持計(jì)劃

    【應(yīng)用筆記】CW32 電容式觸摸按鍵設(shè)計(jì)指南

    前言CW32電容式觸摸按鍵設(shè)計(jì)指南向客戶提供一種利用CW32內(nèi)部資源結(jié)合軟件編程實(shí)現(xiàn)電容式觸摸按鍵有效觸摸檢測(cè)的方法。本指南的內(nèi)容重點(diǎn)在于工作原理、軟件檢測(cè)過程以及調(diào)試指引。利用芯源半
    的頭像 發(fā)表于 07-04 11:44 ?1286次閱讀
    【應(yīng)用筆記】<b class='flag-5'>CW32</b> 電容式觸摸<b class='flag-5'>按鍵</b>設(shè)計(jì)指南

    【外設(shè)移植】按鍵搖桿模塊Ai-M61開發(fā)板

    按鍵搖桿模塊采用金屬按鍵搖桿電位器,
    的頭像 發(fā)表于 03-12 15:24 ?1306次閱讀
    【外設(shè)移植】<b class='flag-5'>雙</b><b class='flag-5'>軸</b><b class='flag-5'>按鍵</b><b class='flag-5'>搖桿</b><b class='flag-5'>模塊</b>Ai-M61開發(fā)板

    【項(xiàng)目展示】基于CW32的遙控循跡小車

    藍(lán)牙模塊、OLED屏幕、TB6612和紅外循跡模塊組成,電源采用可充電鋰電池供電,建議不要使用 1.5V 干電池供電。 圖1 CW32小車 二、硬件部分 2.1主控板 小車主控板由小藍(lán)板和控制底板組成,小藍(lán)板通過排母與控制底板
    的頭像 發(fā)表于 05-31 17:33 ?1653次閱讀
    【項(xiàng)目展示】基于<b class='flag-5'>CW32</b>的遙控循跡小車

    NanoPi +重力搖桿

    介紹JoystickMatrix-Joystick是一個(gè)按鍵搖桿模塊,由兩個(gè)滑動(dòng)變阻器和一個(gè)按鍵
    發(fā)表于 11-13 17:25

    PS2游戲操縱桿搖桿模塊

    PS2游戲操縱桿搖桿模塊按鍵搖桿)產(chǎn)品簡(jiǎn)介:
    發(fā)表于 07-19 09:40

    STM32搖桿控制空心杯電機(jī)搖桿傳感器

    STM32搖桿控制空心杯電機(jī)搖桿傳感器??PS2
    發(fā)表于 09-07 08:43

    搖桿模塊說明

    37種傳感器(十三)之搖桿模塊+Stduino Nano&UNO本文轉(zhuǎn)載自:關(guān)鍵詞:51、stm32、arduino、stduino單片機(jī)、stduino UNO&Nano、搖桿模塊
    發(fā)表于 12-01 07:09

    CW32飯盒派開發(fā)板試用體驗(yàn)】4. ADC采樣搖桿模塊X和Y輸出

    器 前言 本文主要講解如何使用ADC,板載了一個(gè)電位計(jì)連接到了PB00上,官方提供了示例工程,本文就不做過多說明了。 本文使用ADC采集搖桿模塊的模擬量,搖桿的X與Y
    發(fā)表于 06-01 22:13

    CW32電容式觸摸按鍵設(shè)計(jì)指南

    CW32 電容式觸摸按鍵設(shè)計(jì)指南向客戶提供一種利用 CW32 內(nèi)部資源結(jié)合軟件編程實(shí)現(xiàn)電容式觸摸按鍵有效觸摸檢測(cè)的方法。本指南的內(nèi)容重點(diǎn)在于工作原理、軟件檢測(cè)過程以及調(diào)試指引。利用芯源
    發(fā)表于 09-15 06:00

    CW32 電容式觸摸按鍵設(shè)計(jì)指南

    CW32 電容式觸摸按鍵設(shè)計(jì)指南
    的頭像 發(fā)表于 10-25 16:36 ?1255次閱讀
    <b class='flag-5'>CW32</b> 電容式觸摸<b class='flag-5'>按鍵</b>設(shè)計(jì)指南

    基于CW32的RC522刷卡模塊的應(yīng)用

    基于CW32的RC522刷卡模塊的應(yīng)用
    的頭像 發(fā)表于 11-02 14:53 ?1457次閱讀
    基于<b class='flag-5'>CW32</b>的RC522刷卡<b class='flag-5'>模塊</b>的應(yīng)用

    基于CW32的物聯(lián)網(wǎng)應(yīng)用

    CW32】基于CW32的物聯(lián)網(wǎng)應(yīng)用
    的頭像 發(fā)表于 11-02 15:55 ?1040次閱讀
    基于<b class='flag-5'>CW32</b>的物聯(lián)網(wǎng)應(yīng)用

    基于CW32的遙控循跡小車

    本實(shí)驗(yàn)是使用CW32單片機(jī)制作一個(gè)入門的遙控循跡小車。遙控采用藍(lán)牙配合手機(jī)APP進(jìn)行遙控。循跡使用一個(gè)5路的循跡模塊。使用OLED模塊進(jìn)行顯示當(dāng)前小車狀態(tài)。
    的頭像 發(fā)表于 11-17 17:46 ?1286次閱讀
    基于<b class='flag-5'>CW32</b>的遙控循跡小車

    【GD32F303紅楓派開發(fā)板使用手冊(cè)】第十二講 ADC-按鍵搖桿多通道循環(huán)采樣實(shí)驗(yàn)

    本實(shí)驗(yàn)是通過ADC規(guī)則組多通道循環(huán)采樣方式實(shí)現(xiàn)按鍵搖桿傳感器x和y電壓值的讀取,通過本實(shí)驗(yàn)主要學(xué)習(xí)以下內(nèi)容: ?
    的頭像 發(fā)表于 06-11 09:40 ?936次閱讀
    【GD32F303紅楓派開發(fā)板使用手冊(cè)】第十二講   ADC-<b class='flag-5'>雙</b><b class='flag-5'>軸</b><b class='flag-5'>按鍵</b><b class='flag-5'>搖桿</b>多通道循環(huán)采樣實(shí)驗(yàn)