娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

在GD32F310G-START開發板上讀取三軸加速度計

發布者:EtherealGaze最新更新時間:2024-11-11 來源: elecfans關鍵字:三軸加速度計  MCU 手機看文章 掃描二維碼
隨時隨地手機看文章

我拿到的開發板實際板載的 MCU 是 GD32F310G8,QFN28pin 封裝,基于 ARM CORTEX M4 內核,主頻 72MHz, 芯片內置 64KB flash,8KB SRAM, 兩路 I2C 外設。


整體概述

首先感謝極術社區給我試用GD32開發板的機會,讓我體驗一下近幾年國產MCU開發體驗。該芯片是基于arm cortex-M4內核,主頻72Mhz,flash 64k,ram 8k,以及豐富的外設。

本次試用是一個讀取三軸加速度計的實驗,主要使用的是硬件iic。

硬件連接

傳感器介紹

SC7A20 是一款高精度 12bit 數字三軸加速度傳感器芯片,內置功能 更豐富,功耗更低,體積更小,測量更精確。

芯片通過 IC2/SPI 接口與 MCU 通信,加速度測量數據以中斷方式或 查詢方式獲取。INT1和INT2中斷管腳提供多種內部自動檢測的中斷信號, 適應多種運動檢測場合,中斷源包括 6D/4D 方向檢測中斷信號、自由落體 檢測中斷信號、睡眠和喚醒檢測中斷信號、單擊和雙擊檢測中斷信號。

芯片內置高精度校準模塊,對傳感器的失調誤差和增益誤差進行精確補償。 ±2G、±4G、±8G 和±16G 四種可調整的全量程測量范圍,靈活測量外 部加速度,輸出數據率 1HZ 和 400HZ 間可選。

軟件功能

該軟件主要使用了GD32開發板的硬件iic,外部中斷以及串口,這三部分功能,串口的配置在其他文章的當中已經有敘述,本文只主要介紹iic和外部中斷的使用.

硬件iic

初始化gpio

poYBAGMtgqCAENdTAADYMDp2gJQ927.png


配置硬件iic

pYYBAGMtgrKANlA0AACpU0eW9Ys853.png

根據廠商提供的庫函數(具體參考gd32f3x0_i2c.c文件),我們可以很容易的初始化iic。剩下的就是對傳感器進行配置了,該傳感器需要配置寄存器較多,廠商直接提供了一份demo程序,只需要適配讀取寫入的接口就可以很快的使用了。

pYYBAGMtgsiAZ6_LAADBYOow3zU754.png

我需要做的就是把iic的讀取和寫入進行適配適配函數如下:


void I2C_LeaderWrite(uint16_t followerAddress, , uint8_t targetAddress, uint8_t *txBuff,

                     uint8_t numBytes) {

    /* wait until I2C bus is idle */

    while (i2c_flag_get(I2C0, I2C_FLAG_I2CBSY))

        ;

    /* send a start condition to I2C bus */

    i2c_start_on_bus(I2C0);

    /* wait until SBSEND bit is set */

    while (!i2c_flag_get(I2C0, I2C_FLAG_SBSEND))

        ;

    /* send slave address to I2C bus */

    i2c_master_addressing(I2C0, followerAddress, I2C_TRANSMITTER);

    /* wait until ADDSEND bit is set */

    while (!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND))

        ;

    /* clear ADDSEND bit */

    i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND);

    /* wait until the transmit data buffer is empty */

    while (!i2c_flag_get(I2C0, I2C_FLAG_TBE))

        ;


    for (i = 0; i < numBytes; i++) {

        /* data transmission */

        i2c_data_transmit(I2C0, txBuff[i]);

        /* wait until the TBE bit is set */

        while (!i2c_flag_get(I2C0, I2C_FLAG_TBE))

            ;

    }

    /* send a stop condition to I2C bus */

    i2c_stop_on_bus(I2C0);

    /* wait until stop condition generate */

    while (I2C_CTL0(I2C0) & 0x0200)

        ;

}

void I2C_LeaderRead(uint16_t followerAddress, uint8_t targetAddress, uint8_t *rxBuff,

                    uint8_t numBytes) {

    /* wait until I2C bus is idle */

    while (i2c_flag_get(I2C0, I2C_FLAG_I2CBSY))

        ;


    /* send a start condition to I2C bus */

    i2c_start_on_bus(I2C0);


    /* wait until SBSEND bit is set */

    while (!i2c_flag_get(I2C0, I2C_FLAG_SBSEND))

        ;


    /* send slave address to I2C bus */

    i2c_master_addressing(I2C0, followerAddress, I2C_TRANSMITTER);


    /* wait until ADDSEND bit is set */

    while (!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND))

        ;


    /* clear the ADDSEND bit */

    i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND);


    /* wait until the transmit data buffer is empty */

    while (SET != i2c_flag_get(I2C0, I2C_FLAG_TBE))

        ;


    /* enable I2C0*/

    i2c_enable(I2C0);


    /* send the EEPROM's internal address to write to */

    i2c_data_transmit(I2C0, targetAddress);


    /* wait until BTC bit is set */

    while (!i2c_flag_get(I2C0, I2C_FLAG_BTC))

        ;


    /* send a start condition to I2C bus */

    i2c_start_on_bus(I2C0);


    /* wait until SBSEND bit is set */

    while (!i2c_flag_get(I2C0, I2C_FLAG_SBSEND))

        ;


    /* send slave address to I2C bus */

    i2c_master_addressing(I2C0, followerAddress, I2C_RECEIVER);


    /* wait until ADDSEND bit is set */

    while (!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND))

        ;


    /* clear the ADDSEND bit */

    i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND);


    /* while there is data to be read */

    for (int i = 0; i < numBytes; i++) {

        /* code */


        /* read a data from I2C_DATA */

        rxBuff[i++] = i2c_data_receive(I2C0);

        /* send a stop condition */

        i2c_stop_on_bus(I2C0);

    }


    /* wait until the stop condition is finished */

    while (I2C_CTL0(I2C0) & 0x0200)

        ;


    /* enable acknowledge */

    i2c_ack_config(I2C0, I2C_ACK_ENABLE);


    i2c_ackpos_config(I2C0, I2C_ACKPOS_CURRENT);

}


然后把這兩個函數適配:

poYBAGMtgtqAJ3rOAAB9FKfsQfM576.png

然后對傳感器進行設置

poYBAGMtgvyAM0GkAADiuobSYW4011.png

外部中斷


使用外部中斷可以使用用于喚醒mcu,這對設計低功耗的產品很有意義,當傳感器超過設定的閾值的時候,那么就會產生一個中斷來通知mcu,需要進一步的處理數據,外部中斷的配置如下所示:


void exit_wakeup_interrupt_config(void)

{

     /* configure the priority group */

    nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);


    /* enable the key wakeup clock */

    rcu_periph_clock_enable(RCU_GPIOA);

    rcu_periph_clock_enable(RCU_CFGCMP);


    /* configure button pin as input */

    gpio_mode_set(GPIOA, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_0);


    /* enable and set key wakeup EXTI interrupt to the higher priority */

    nvic_irq_enable(EXTI0_1_IRQn, 2U, 0U);


    /* connect key wakeup EXTI line to key GPIO pin */

    syscfg_exti_line_config(EXTI_SOURCE_GPIOA, EXTI_SOURCE_PIN0);


    /* configure key wakeup EXTI line */

    exti_init(EXTI_0, EXTI_INTERRUPT, EXTI_TRIG_FALLING);

    exti_interrupt_flag_clear(EXTI_0);

}


數據處理

由于我們使用的是三軸傳感器,對于姿態位置的計算并不是很精確,因此,此處只用簡單角度計算,傾角的計算原理如下

poYBAGMtgxqAX2ZzAADMRlEI1A4650.png


pYYBAGMtgymATucYAAAfnX5F69k016.png


計算代碼如下:


#define DEG_TO_RAD(x) ((x) * 0.01745329252)

#define RAD_TO_DEG(x) ((x) * 57.2957795131)

void angle_calculation() {

    double pitch, roll, paw;

    pitch = atan(xyz_mg[X] / sqrt(pow(xyz_mg[Y], 2) + pow(xyz_mg[Z], 2)));

    roll = atan(xyz_mg[Y] / sqrt(pow(xyz_mg[X], 2) + pow(xyz_mg[Z], 2)));

    paw = atan(sqrt(pow(xyz_mg[X], 2) + pow(xyz_mg[Y], 2)) / xyz_mg[Z]);


    printf('[RAD]pitch:%.2f | roll:%.2f | paw:%.2f rn', pitch, roll, paw);

    printf('[DEG]pitch:%.2f° | roll:%.2f° | paw:%.2f° rn', RAD_TO_DEG(pitch), RAD_TO_DEG(roll),

           RAD_TO_DEG(paw));

}


關鍵字:三軸加速度計  MCU 引用地址:在GD32F310G-START開發板上讀取三軸加速度計

上一篇:GD32MCU最小系統構成條件
下一篇:STM32 MPU是什么產品?了解嵌入式系統中微處理器的新變化

推薦閱讀最新更新時間:2025-07-04 10:18

基于加速度計SCA3000和LPC2210的傾斜角傳感器設計
由加速度傳感器測量傾斜角的途徑很多,文獻中提出了一種基于兩軸加速度傳感器ADXL213的傾角測量裝置,實現了全擺幅高精度測量,并能在運動車輛中抵消前進方向加速度,實現運動中單方向高精度測量。文獻中同樣運用兩軸壓力傳感器實現單方向全擺幅傾角測量文獻。文獻中運用兩軸加速度傳感器ADXL202實現了全方位,45°擺幅內低誤差傾斜角測量。文獻中運用液態兩軸傾斜角傳感器實現全方位、低擺幅、高精度傾斜角傳感器。單軸加速度傳感器只能實現單方向,低擺幅傾斜角測量,兩軸傾斜角傳感器,方向和擺幅不能兼顧。本文將討論采用三軸微加速度傳感器實現智能化傾斜角傳感器方法。 1 傾斜角測量原理 對于軸加速度傳感器,當它的傳感方向和重力加速度方向一致時,假如
[單片機]
基于<font color='red'>三</font><font color='red'>軸</font><font color='red'>加速度計</font>SCA3000和LPC2210的傾斜角傳感器設計
英飛凌將CAPSENSE?集成到PSOC? HV MCU中 用于智能傳感器和執行器
6月12日,英飛凌科技股份公司(Infineon Technologies AG)推出PSOC 4 HVMS產品系列,進一步擴展其PSOC? 4 HV微控制器(MCU)平臺。該系列產品針對空間受限的傳感或執行器應用進行了優化,將高壓功能和先進的模擬傳感功能集成到標準微控制器中,只需極少的外部元件即可連接汽車電池和車載網絡。 圖片來源:英飛凌 在汽車市場,功能安全正日益被應用于低端微控制器應用。與此同時,汽車設計師正致力于為空間受限的應用開發緊湊、高度集成的控制單元。人們對智能、美觀的內飾以及更佳駕駛體驗的需求日益增長,也推動了對能夠在嚴苛條件下可靠工作的強大電容式感應解決方案的需求。為了滿足這一需求,英飛凌推出PSOC
[汽車電子]
英飛凌將CAPSENSE?集成到PSOC? HV <font color='red'>MCU</font>中 用于智能傳感器和執行器
車用MCU是從1到N的長期主義過程
汽車產業正在經歷著巨大的變革,并體現出高速的增長勢頭。在這場變革中,背后對應著兩個底層邏輯,第一是全球化從1到N的需求;第二,平臺化才是性價的保證。兆易創新科技集團股份有限公司汽車產品部負責人何芳指出,一款芯片能否滿足客戶的需求,取決于這幾個階梯,第一階梯是可靠性,這是從1到N的關鍵;第二階梯是OTA,產品設計時需要定義如何支持未來10-15年汽車性能的OTA功能;第三階梯是可拓展性,幫助客戶更好地實現功能增加;第四階梯是平臺化,這是保證性價比、出口體系的關鍵一環。 然而,國內企業由于發展歷程積累相較國外企業還比較短,同樣規格的產品在性價比上優勢不高,那要如何找到適合自己的0到1?何芳指出:“首先要了解客戶未來在電子電氣
[汽車電子]
車用<font color='red'>MCU</font>是從1到N的長期主義過程
車規MCU市場“重構”!群雄環伺下,中國本土廠商「蓄勢突圍」
在整車EE架構加速升級的大背景之下,全球車規MCU市場已經進入了重塑期,中國本土車規MCU廠商正在蓄勢突圍。 9月25日,兆易創新GigaDevice(股票代碼 603986)重磅推出全新一代車規級MCU GD32A7系列。據悉,GD32A7系列搭載了超高性能Arm? Cortex?-M7內核,并且集成了優異的性能、增強的安全升級、豐富的外設接口,可以滿足車身域控(BDC)、車身控制(BCM)、遠程通信終端(T-BOX)、車燈控制(Lighting)、電池管理(BMS)、車載充電機(OBC)、底盤應用(Chassis)、直流變換器(DC-DC)等多種應用場景。 眾所周知,由于技術壁壘高、研發難度大等原因,我國車規級M
[汽車電子]
車規<font color='red'>MCU</font>市場“重構”!群雄環伺下,中國本土廠商「蓄勢突圍」
基于stm32單片機的通用定時器配置
stm32單片機的定時器資源相當豐富,它的定時器分為高級控制定時器、通用定時器和基本定時器,具體這些定時器資源在哪個系列的片子有就得看不同的片子的手冊了。他們具體有什么區別,我也是剛接觸這個,看他的數據手冊介紹也是茫然,主要是剛開始摸,那些功能都沒用到,反正用做定時作用的話哪種定時器都行。在這我就把我自己配置通用定時器的方法及心得簡短做個總結,以防以后忘記了。我配置的是定時器2(TIM2)。 通用定時器的時鐘可來自于外部或內部,選用默認即是采用內部的。通用定時器的時鐘來源為APB1總線,所以首先,得將APB1外設時鐘打開。 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE)
[單片機]
基于51單片機,蜂鳴器和led每秒1滴1亮的程序
#include reg52.h #define uchar unsigned char #define uint unsigned int int seccnt,m=0; char tzsta,msta; sbit led=P2^0; sbit beep=P1^5; void ini()//定時器0 { seccnt=0; msta=tzsta=0; TMOD=0x01; TH0=0x0FF; TL0=0x9C; TR0=1; } void on()//蜂鳴器和燈的功能 { if(m =500) { beep=~beep; } if(m =100
[單片機]
蜂鳴器播放DOREMI+普中51單片機+江科大自化協
現象 在無源蜂鳴器上循環演奏低音“DO、RE、MI、FA、SO、LA、SI”這7個音調。 參考程序 1 主函數 #include REGX52.H #include delayms.h #include timer0.h sbit Buzzer = P2^5; //音調與頻率對照表,低中高:1,1#,2,2#,3,4,4#,5,5#,6,6#,7 //unsigned int FreqTable ={ // 63628,63731,63835,63928,64021,64103,64185,64260,64331,64400,64463,64528, // 64580,64633,64684,647
[單片機]
MCU CPU 區別
MCU(Micro Controller Unit),又稱單片微型計算機(Single Chip Microcomputer),簡稱單片機,是指隨著大規模集成電路的出現及其發展,將計算機的CPU、RAM、ROM、定時數器和多種I/O接口集成在一片芯片上,形成芯片級的計算機。 MCU按其存儲器類型可分為無片內ROM型和帶片內ROM型兩種。對于無片內ROM型的芯片,必須外接EPROM才能應用(典型芯片為8031)。帶片內ROM型的芯片又分為片內EPROM型(典型芯片為87C51)、MASK片內掩模ROM型(典型芯片為8051)、片內FLASH型(典型芯片為89C51)等類型 CPU是中央處理單元(Central Processing
[單片機]
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 文山县| 普定县| 宣化县| 临清市| 缙云县| 陈巴尔虎旗| 平昌县| 梨树县| 鄂州市| 莒南县| 伊宁县| 石屏县| 昌图县| 中方县| 迁西县| 郑州市| 台南市| 潞西市| 历史| 池州市| 兴宁市| 旬邑县| 襄汾县| 同江市| 甘南县| 闸北区| 南陵县| 台州市| 浦江县| 兴隆县| 巴彦淖尔市| 铜川市| 汝城县| 全州县| 都兰县| 长垣县| 南昌市| 三亚市| 金昌市| 甘德县| 酒泉市|