找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2313|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

STM32單片機(jī)+ADXL345(中斷方式)計(jì)步器的準(zhǔn)備程序(串口調(diào)試)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:249376 發(fā)表于 2022-10-25 22:37 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
本文介紹了利用ADXL345中斷喚醒停止模式下的STM32F103C8T6,為進(jìn)一步開(kāi)發(fā)計(jì)步器做準(zhǔn)備。
從上位機(jī)串口通訊記錄了整個(gè)過(guò)程, 代碼中有關(guān)OLED顯示屏可以不接。

1. ADXL345寄存器, 有好多,為了觀察明顯,這里設(shè)置了ACTIVITY和INACTIVITY模式,都能觸發(fā)INT2:(ADXL345.c)

        Single_Write_ADXL345(THRESH_ACT,0x20);      //檢測(cè)活動(dòng)的閾值為2g時(shí)產(chǎn)生中斷,認(rèn)為是開(kāi)始活動(dòng)了
        Single_Write_ADXL345(THRESH_INACT,0x01);    //0.1875g,小于它,就認(rèn)為是不活動(dòng)
        Single_Write_ADXL345(TIME_INACT,0x02);      //不活動(dòng)2秒,就認(rèn)為是不活動(dòng)中斷觸發(fā)
        Single_Write_ADXL345(ACT_INACT_CTL,0xEE);   //使能X、Y、Z三軸的Activity和Inactivity功能
        Single_Write_ADXL345(INT_MAP,0x18);         //00011000, Activity和Inactivity 活動(dòng)都映射到INT2        Single_Write_ADXL345(INT_ENABLE,0x18);    //80 DATA_READY中斷開(kāi)啟, 10 Activity 08 inactivity   

2.    觀察中斷是哪個(gè)活動(dòng)觸發(fā)的:訪問(wèn)寄存器:INT_SOURCE (main.c)

        printf("\r\n INT_SOURCE: 0X30= %lX  After Read\r\n",  Single_Read_ADXL345(0X30));  //INT_SOURCE
        
        讀兩遍INT_SOURCE (0X30)可以得到
                INT_SOURCE: 0X30= 93  After Read  93=10010011,從右到左第1位是OVERRUN,第2位是Watermark,第5位是ACTIVITY,第8位是DATA_READY
                INT_SOURCE: 0X30= 83  After Read  83=10000011,可以看到本次中斷是由ACTIVITY觸發(fā)的,其它三個(gè)標(biāo)志位不用管它
               
        
3. STM32 的進(jìn)入停機(jī)模式:(main.c)
        鋰電池供電的情況下最好采用停機(jī)模式。(低功耗還有待機(jī)模式, 等于從頭開(kāi)機(jī)運(yùn)行,而行走的步數(shù)需要在喚醒后讀到, 所以不用它)。
        
                /* 進(jìn)入停止模式,設(shè)置電壓調(diào)節(jié)器為低功耗模式,等待中斷喚醒 */
                PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);
               
4. 中斷處理函數(shù):(exit.c)
        EXTI0_IRQHandler可以提供給一個(gè)按鍵,喚醒顯示步數(shù)在OLED上面,包括打開(kāi)顯示屏。
        EXTI1_IRQHandler處理的是INT2中斷,setADXL345()函數(shù)記錄了標(biāo)志位為1,供main.c 在主循環(huán)里面進(jìn)行處理


void EXTI0_IRQHandler(void)
{
                if(EXTI_GetITStatus(KEY1_INT_EXTI_LINE) != RESET)
        {
                printf("\r\n -----------------------EXTI0_IRQHandler----------------------- \r\n");   
        
          EXTI_ClearITPendingBit(KEY1_INT_EXTI_LINE);  //清除EXTI0線路掛起位
        }
}

void EXTI1_IRQHandler(void)
{
  //確保是否產(chǎn)生了EXTI Line中斷
        if(EXTI_GetITStatus(KEY2_INT_EXTI_LINE) != RESET)
        {

                //由于停止喚醒后使用的是HSI時(shí)鐘,與原來(lái)使用的HSE時(shí)鐘時(shí)的頻率不一致,會(huì)影響波特率,若此處直接printf會(huì)亂碼
                printf("\r\n -----------------------EXTI1_IRQHandler----------------------- \r\n");   

                setADXL345();
                //清除中斷標(biāo)志位
                EXTI_ClearITPendingBit(KEY2_INT_EXTI_LINE);     
        }  
}

5. 主循環(huán)里的ADXL數(shù)據(jù)讀。海╩ain.c)

        由中斷設(shè)置的標(biāo)志位在這里處理, ReadData_x(); 讀取到temp_X,temp_Y,temp_Z, 進(jìn)行步數(shù)的計(jì)算。

                if(getADXL345()== 1)       {
      reSetADXL345();  //及時(shí)讀取adxl345數(shù)據(jù)
      ReadData_x();                                                  //三軸檢測(cè)函數(shù)
                        printf("\r\n temp_X %lf. \r\n",temp_X );
                        printf("\r\n temp_Y %lf. \r\n",temp_Y );
                        printf("\r\n temp_Z %lf. \r\n",temp_Z );
                        printf("\r\n INT_SOURCE: 0X30= %lX  After Read\r\n",  Single_Read_ADXL345(0X30));  //INT_SOURCE
                        printf("\r\n INT_SOURCE: 0X30= %lX  After Read\r\n",  Single_Read_ADXL345(0X30));  //INT_SOURCE
      CheckNum++;
      if((temp_Y>450)||(temp_Y<-450)) //查看正常次數(shù)     
      {
        Normal_num++;  //正常次數(shù)++
                                printf("\r\n Normal_num %d \r\n",Normal_num );
      }
      else
      {
        Error_num++;//傾斜次數(shù)
                                printf("\r\n Error_num %d \r\n",Error_num );
      }
      if((Error_num!=0)&&(Normal_num!=0))//檢測(cè)到步數(shù)

      {
                                BuShu++;   //步數(shù)脈沖量++
                                printf("\r\n BuShu %d \r\n",BuShu );
        Error_num=0;    //清除一個(gè)周期檢測(cè)
        Normal_num=0;
      }
    }
調(diào)試結(jié)果:
[14:51:28.491]收←◆
進(jìn)入停止模式,A0端口按鍵或A1端口ADXL345->INT2可喚醒

[14:53:38.943]收←◆\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0
[14:53:39.375]收←◆
已退出停止模式

temp_X 124.800003.

temp_Y 254155.203125.

temp_Z 9297.599609.

INT_SOURCE: 0X30= 93  After Read

INT_SOURCE: 0X30= 83  After Read

Normal_num 10

[14:53:40.591]收←◆
-----------------------EXTI1_IRQHandler-----------------------

[14:53:41.577]收←◆
temp_X 156.000000.

temp_Y 254155.203125.

temp_Z 9328.799805.

INT_SOURCE: 0X30= 8A  After Read

INT_SOURCE: 0X30= 83  After Read

Normal_num 11

[14:53:43.771]收←◆
temp_X 187.199997.

temp_Y 254186.406250.

temp_Z 9328.799805.

INT_SOURCE: 0X30= 83  After Read

INT_SOURCE: 0X30= 83  After Read

Normal_num 12

[14:53:52.143]收←◆
進(jìn)入停止模式,A0端口按鍵或A1端口ADXL345->INT2可喚醒


制作出來(lái)的實(shí)物圖如下:


Keil代碼下載: Keil程序.7z (211.6 KB, 下載次數(shù): 46)

評(píng)分

參與人數(shù) 1黑幣 +80 收起 理由
admin + 80 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:249376 發(fā)表于 2022-10-26 14:57 | 只看該作者
本帖最后由 dvxchen 于 2022-10-26 15:12 編輯

調(diào)試結(jié)果:

[14:51:28.491]收←◆
進(jìn)入停止模式,A0端口按鍵或A1端口ADXL345->INT2可喚醒

[14:53:38.943]收←◆\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0
[14:53:39.375]收←◆
已退出停止模式

temp_X 124.800003.

temp_Y 254155.203125.

temp_Z 9297.599609.

INT_SOURCE: 0X30= 93  After Read

INT_SOURCE: 0X30= 83  After Read

Normal_num 10

[14:53:40.591]收←◆
-----------------------EXTI1_IRQHandler-----------------------

[14:53:41.577]收←◆
temp_X 156.000000.

temp_Y 254155.203125.

temp_Z 9328.799805.

INT_SOURCE: 0X30= 8A  After Read

INT_SOURCE: 0X30= 83  After Read

Normal_num 11

[14:53:43.771]收←◆
temp_X 187.199997.

temp_Y 254186.406250.

temp_Z 9328.799805.

INT_SOURCE: 0X30= 83  After Read

INT_SOURCE: 0X30= 83  After Read

Normal_num 12

[14:53:52.143]收←◆
進(jìn)入停止模式,A0端口按鍵或A1端口ADXL345->INT2可喚醒
回復(fù)

使用道具 舉報(bào)

板凳
ID:249376 發(fā)表于 2022-11-16 10:56 | 只看該作者
原理圖和嘉立創(chuàng)PCB文件

原理圖 STM32F103C8T6_ADXL345.pdf

150.11 KB, 下載次數(shù): 15, 下載積分: 黑幣 -5

計(jì)步器 STM32F103C8T6_ADXL345_OLED3.7_PHASE01x.zip

932.69 KB, 下載次數(shù): 15, 下載積分: 黑幣 -5

回復(fù)

使用道具 舉報(bào)

地板
ID:249376 發(fā)表于 2022-11-16 11:22 | 只看該作者
注意ADXL的方向性,如圖

279078917.jpg (103.04 KB, 下載次數(shù): 88)

279078917.jpg
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表