精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

STM32F103C8T6使用外部中斷法和輸入捕獲法進行編碼器測速

CHANBAEK ? 來源:月月望歸鳥 ? 作者:K.Fire ? 2023-06-15 16:52 ? 次閱讀

01 前言

如果我們想對電機進行速度或者轉角的精確控制,需要使用到很多算法,比如非常經典的PID控制算法,或者一些只能算法,但這些算法都需要傳感器來提供轉速或轉角的反饋值,對于電機來說,編碼器是非常流行并且實用的電機配套傳感器,本文使用STM32F103C8T6+L298N+MG513P30電機進行直流電機的編碼器測速。

02 編碼器原理

1.分類

圖片

光電式編碼器的精準度比霍爾式要高,但是由于它需要紅外線發生器和接收器,相對來說造價要貴一些。現在我們比較常用的是霍爾式增量編碼器,有很多電機都會自帶編碼器。

image.png

2.測速方法分類

(1)M法測速

編碼器輸出的脈沖個數代表了位置,那么單位時間里的脈沖個數表示這段時間里的平均速度。因此,我們可以通過計量單位時間脈沖個數即可以估算出平均速度,稱為M法測速(測脈沖個數)測速原理如圖所示。

圖片

例如,若編碼器每轉產生N個脈沖,在T時間(單位s)產生m個脈沖,那么平均轉速如下式所示:

圖片

式中 n——平均轉速(r/min);

T——測速采樣時間(s);

m——T時間內測得的編碼器脈沖個數;

N——編碼器每轉脈沖數。

(2)T法測速

若用M法測速,在記錄時間短、速度低的時候,只能記錄幾個脈沖,則分辨率降低。針對該問題,目前解決方法為:可以采用輸出碼盤脈沖為一個時間間隔,然后用計數器記錄在這段時間里高速脈沖源發出的脈沖數。即通過采集到脈沖源脈沖數來計量編碼器兩個脈沖時間間隔,從而估算出速度,稱為T法測速(測脈沖周期),測速原理圖如圖所示。

圖片

T法測速,利用編碼器產生的脈沖用作門電路的觸發信號;用已知頻率f的時鐘信號做輸入。若控制門電路在編碼器脈沖上升沿到來時開始導通,再次上升沿到來時關閉,即計數器只記錄一個編碼器脈沖周期內的時鐘脈沖個數。若在編碼器相鄰脈沖之間記錄的脈沖時鐘個數為m,那么,可以計算兩個編碼器脈沖的時間間隔為m /f;若編碼器每轉有N個線脈沖輸出,那么我們就知道編碼器轉過1/N轉時需要時間m /f。據此,可計算與編碼器同軸轉速為公式所示。

圖片

式中 n ——平均轉速(r/min);

f ——時鐘脈沖頻率(個/s);

m ——兩個編碼器脈沖之間的時鐘脈沖個數;

N ——編碼器每轉脈沖數。

編碼器一般會輸出兩路信號,分別稱為A相和B相,它們相差90°,因此編碼器也稱為十字碼盤,通過捕獲兩路輸出信號可以測算出電機的轉速和轉向。

STM32使用編碼器的方法有兩種分別是外部中斷法和輸入捕獲法,這兩種方法都屬于M法測速,兩種方法比較來說外部中斷法占用CPU資源較多,平時比較常用的是輸入捕獲法,但博主兩種方法都調試出來了,因此記錄下來跟大家分享一下。

03 外部中斷法測速

對于外部中斷的知識,各個講STM32的教程都有,我就不過多贅述,外部中斷的初始化都一樣,主要是出發外部中斷時需要進行的操作。

圖片

看這張圖,正轉方向是信號向右走,因為我們是同時捕獲兩路信號,有以下幾種情況:

圖片

然后我們設置兩個變量用來存儲捕獲的脈沖數,每捕獲到一次脈沖信號根據上表進行判斷,正轉時使其加1;反轉時使其減1;然后配置一個定時器,每隔一段時間反饋一次測速值。

1.外部中斷配置

先編寫一個函數初始化外部中斷,使用PB12-15引腳復用為外部中斷輸入,外部中斷配置步驟如下:

1.端口初始化:RCC_APB2PeriphClockCmd()、GPIO_Init()

2.使能復用功能時鐘:RCC_APB2PeriphClockCmd()

3.設置IO口與中斷線的映射關系:GPIO_EXTILineConfig()

4.初始化線上中斷:EXTI_Init()

5.配置中斷分組:NVIC_Init()

完整函數如下:

/**************************************************************************
功能:應用外部中斷方式采集編碼器數據,使用M法測速反饋車輪實時速度
函數:Encoder_EXTIX_Init(void)  EXTI15_10_IRQHandler(void)
作者:K.Fire
日期:2022.01.30
引腳:PB12(左輪A相) PB13(左輪B相) PB14(右輪A相) PB15(右輪B相)
參數:void
*************************************************************************/


int Encoder_L_EXTI=0;
int Encoder_R_EXTI=0;


void Encoder_EXTIX_Init(void)
{
  //1.端口初始化
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
  GPIO_InitTypeDef GPIO_InitStruct;
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD;
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 |GPIO_Pin_14 | GPIO_Pin_15;


  GPIO_Init(GPIOB,&GPIO_InitStruct);


  //2.使能復用功能時鐘
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);


  //3.設置IO口與中斷線的映射關系
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource12);
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource13);
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource15);


  //4.初始化線上中斷
  EXTI_InitTypeDef EXTI_InitStruct;
  EXTI_InitStruct.EXTI_Line = EXTI_Line12 | EXTI_Line13 | EXTI_Line14 | EXTI_Line15;
  EXTI_InitStruct.EXTI_LineCmd = ENABLE;
  EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising_Falling;//跳變沿觸發
  EXTI_Init(&EXTI_InitStruct);


  //5.配置中斷分組
  NVIC_InitTypeDef NVIC_InitStruct;
  NVIC_InitStruct.NVIC_IRQChannel = EXTI15_10_IRQn;
  NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
  NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
  NVIC_Init(&NVIC_InitStruct);
}

2.外部中斷服務函數

函數的判斷邏輯與上表一致,外部中斷捕獲判斷函數如下:

void EXTI15_10_IRQHandler(void)
{
  if(EXTI_GetITStatus(EXTI_Line12) != RESET)//左輪A相 PB12
  {
    EXTI_ClearITPendingBit(EXTI_Line12);  //清除LINE上的中斷標志位
    if(PBin(12)==0)   //這里判斷檢測到的是否是下降沿
    {
      if(PBin(13)==0)   Encoder_L_EXTI++;//B相的電平如果是低,電機就是正轉加1
      else             Encoder_L_EXTI--;//否則就是反轉減1
    }
    else                  //上升沿
    { 
      if(PBin(13)==1)  Encoder_L_EXTI++; //B相電平如果為高,電機就是正轉加1
      else             Encoder_L_EXTI--;//否則就是反轉減1
    }
  }


  if(EXTI_GetITStatus(EXTI_Line13) != RESET)//左輪B相 PB13
  {
    EXTI_ClearITPendingBit(EXTI_Line13);  //清除LINE上的中斷標志位
    if(PBin(13)==0)   //這里判斷檢測到的是否是下降沿
    {
      if(PBin(12)==1)   Encoder_L_EXTI++;//B相的電平如果是高,電機就是正轉加1
      else             Encoder_L_EXTI--;//否則就是反轉減1
    }
    else                  //上升沿
    { 
      if(PBin(12)==0)  Encoder_L_EXTI++; //B相電平如果為高,電機就是正轉加1
      else             Encoder_L_EXTI--;//否則就是反轉減1
    }
  }


  if(EXTI_GetITStatus(EXTI_Line14) != RESET)//右輪A相 PB14
  {
    EXTI_ClearITPendingBit(EXTI_Line14);  //清除LINE上的中斷標志位
    if(PBin(14)==0)   //這里判斷檢測到的是否是下降沿
    {
      if(PBin(15)==0)   Encoder_R_EXTI++;//B相的電平如果是低,電機就是正轉加1
      else             Encoder_R_EXTI--;//否則就是反轉減1
    }
    else                  //上升沿
    { 
      if(PBin(15)==1)  Encoder_R_EXTI++; //B相電平如果為高,電機就是正轉加1
      else             Encoder_R_EXTI--;//否則就是反轉減1
    }
  }


  if(EXTI_GetITStatus(EXTI_Line15) != RESET)//右輪B相 PB15
  {
    EXTI_ClearITPendingBit(EXTI_Line15);  //清除LINE上的中斷標志位
    if(PBin(15)==0)   //這里判斷檢測到的是否是下降沿
    {
      if(PBin(14)==1)   Encoder_R_EXTI++;//A相的電平如果是高,電機就是正轉加1
      else             Encoder_R_EXTI--;//否則就是反轉減1
    }
    else                  //上升沿
    { 
      if(PBin(14)==0)  Encoder_R_EXTI++; //A相電平如果為低,電機就是正轉加1
      else             Encoder_R_EXTI--;//否則就是反轉減1
    }
  }


}

注意一下,在使用引腳時不要重復,因為Px0(x=AB..F)都是使用的同一條外部中斷線(EXIT0)

3.讀取捕獲脈沖數值

配置完定時器后,每過一段時間調用讀取函數,通過公式可以計算出實際的脈沖值。

函數如下:

/**************************************************************************
功能:獲取不同方式下的脈沖值
函數:int Read_Encoder(u8 TIMX)
作者:K.Fire
日期:2022.01.30
參數:1:外部中斷法左輪 2:外部中斷法右輪 3:輸入捕獲法左輪 4:輸入捕獲法右輪
**************************************************************************/

int Read_Encoder(u8 TIMX)
{
    int Encoder_TIM;    
    switch(TIMX)
  {
    case 1:Encoder_TIM=Encoder_L_EXTI;  Encoder_L_EXTI=0; break;
    case 2:Encoder_TIM=Encoder_R_EXTI;  Encoder_R_EXTI=0; break;
    case 3:Encoder_TIM=TIM3 - > CNT;  TIM3 - > CNT=0;break;  
    case 4:Encoder_TIM=TIM4 - > CNT;  TIM4 - > CNT=0;break;
      default:Encoder_TIM=0;break;
  }
    return Encoder_TIM;
}

/**************************************************************************
功能:獲取并打印輸出實際速度值
函數:void Get_SpeedNow(float* CurrentVelcity_L,float* CurrentVelcity_R)
作者:K.Fire
日期:2022.01.30
參數:CurrentVelcity_L:左輪實時速度(地址)  CurrentVelcity_R:右輪實時速度(地址)
**************************************************************************/

extern int Current_LN,Current_RN;//速度脈沖數

void Get_SpeedNow(int* CurrentVelcity_L,int* CurrentVelcity_R)
{

  /*外部中斷方式*/
  Current_LN = Read_Encoder(1);
  Current_RN = Read_Encoder(2);

  *CurrentVelcity_L = Current_LN * MPN * 100;//計算實際速度值
  *CurrentVelcity_R = Current_RN * MPN * 100;

  printf("The Current Left Wheel Velocity is: %d mm/s.\\r\\n",*CurrentVelcity_L);
  printf("The Current Right Wheel Velocity is: %d mm/s.\\r\\n",*CurrentVelcity_R);
}

4.測試結果

通過USART1串口向電腦輸出實時速度值,結果如下:

圖片

04 輸入捕獲發測速

輸入捕獲是將TIM定時器的CHx通道配置為輸入捕獲模式,每捕獲到一個信號會將響應定時器的CNT計數器的值加/減1,然后每隔一段時間提取并清空計數器的值就可以測算出電機的實時轉速。

1.輸入捕獲模式配置

輸入捕獲模式的初始化,各個STM32的教學視頻都有,只是在配置編碼器模式時,需要用到一個編碼器模式的配置函數:TIM_EncoderInterfaceConfig()

輸入捕獲模式的初始化步驟如下:

1.使能定時器和通道對應的時鐘:RCC_APB1PeriphClockCmd()

2.初始化IO口:GPIO_Init()

3.初始化定時器:TIM_TimeBaseInit()

4.配置編碼器模式:TIM_EncoderInterfaceConfig()

5.初始化輸入捕獲通道:TIM_ICInit()

6.開啟更新中斷:TIM_ITConfig()

7.使能定時器:TIM_Cmd()

完整的代碼如下:

/**************************************************************************
功能:應用輸入捕獲方式采集編碼器數據,使用M法測速反饋車輪實時速度
函數:void Encoder_CAP_Init()
作者:K.Fire
日期:2022.01.30
引腳:PA6(左輪A相) PA6(左輪B相) PB6(右輪A相) PB7(右輪B相)
參數:無
**************************************************************************/

void Encoder_CAP_Init_L()
{
  /*1.使能定時器和通道對應的時鐘*/
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

  /*2.初始化IO口*/
  GPIO_InitTypeDef GPIO_InitStruct;
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD;//推挽下拉輸入
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
  GPIO_Init(GPIOA,&GPIO_InitStruct);

  /*3.初始化定時器*/
  TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
  TIM_TimeBaseInitStruct.TIM_ClockDivision = 0;
  TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseInitStruct.TIM_Period = 0xffff;
  TIM_TimeBaseInitStruct.TIM_Prescaler = 0x0;
  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct);

  //配置編碼器模式
  TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising);

  /*4.初始化輸入捕獲通道*/
  TIM_ICInitTypeDef TIM_ICInitStruct;
  TIM_ICStructInit(&TIM_ICInitStruct);
  TIM_ICInitStruct.TIM_ICFilter = 10;//設置濾波器,重復檢測10次,防止抖動,增加精度
  TIM_ICInit(TIM3,&TIM_ICInitStruct);

  TIM_ClearFlag(TIM3, TIM_FLAG_Update);//清除TIM的更新標志位

  /*5.開啟更新中斷*/
  TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);

  TIM_SetCounter(TIM3,0);//計數器置零
  TIM3- >CNT = 0x7fff;

//  /*4.初始化輸入捕獲通道*/
//  TIM_ICInitTypeDef TIM_ICInitStruct;
//  TIM_ICInitStruct.TIM_Channel = TIM_Channel_1 | TIM_Channel_2;//通道1和2
//  TIM_ICInitStruct.TIM_ICFilter = 10;//設置濾波器,重復檢測10次,防止抖動,增加精度
//  TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_TIM_ICPolarity_Rising;//上升沿捕獲
//  TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;//配置輸入分頻,不分頻
//  TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;//不設置重映射
//  TIM_ICInit(TIM2,&TIM_ICInitStruct);
//  
//  /*5.開啟捕獲中斷,并配置中斷*/
//  TIM_ITConfig(TIM2, TIM_IT_CC1 | TIM_IT_CC2, ENABLE);
//  
//  NVIC_InitTypeDef NVIC_InitStruct;
//  NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn;
//  NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
//  NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
//  NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
//  NVIC_Init(&NVIC_InitStruct);

  /*6.使能定時器*/
  TIM_Cmd(TIM3,ENABLE);

  /*7.編寫中斷服務函數*/

}

一個編碼器需要占用一個定時器,這里我使用的是TIM3和TIM4

注意:在初始化IO口時,選擇輸入輸出模式有點問題。

網上有的說選擇輸入浮空模式、有的說選擇輸入上拉模式,但是我調試的時候這兩種都不出結果,我改成輸入下拉模式的是才調試成功,大家在實際調試過程中可以幾個輸入模式都試一下。

2.讀取捕獲脈沖數值

這部分和上面外部中斷法的函數一樣,輸入3和4參數使用輸入捕獲方式提取計數器的值。

/**************************************************************************
功能:獲取不同方式下的脈沖值
函數:int Read_Encoder(u8 TIMX)
作者:K.Fire
日期:2022.01.30
參數:1:外部中斷法左輪 2:外部中斷法右輪 3:輸入捕獲法左輪 4:輸入捕獲法右輪
**************************************************************************/

int Read_Encoder(u8 TIMX)
{
    int Encoder_TIM;    
    switch(TIMX)
  {
    case 3:Encoder_TIM=TIM3- >CNT-0x7fff;  TIM3- >CNT=0x7fff;break;  
    case 4:Encoder_TIM=TIM4- >CNT-0x7fff;  TIM4- >CNT=0x7fff;break;
      default:Encoder_TIM=0;break;
  }
    return Encoder_TIM;
}

/**************************************************************************
功能:獲取并打印輸出實際速度值
函數:void Get_SpeedNow(float* CurrentVelcity_L,float* CurrentVelcity_R)
作者:K.Fire
日期:2022.01.30
參數:CurrentVelcity_L:左輪實時速度(地址)  CurrentVelcity_R:右輪實時速度(地址)
**************************************************************************/

extern int Current_LN,Current_RN;//速度脈沖數

void Get_SpeedNow(int* CurrentVelcity_L,int* CurrentVelcity_R)
{
  /*輸入捕獲方式*/
  Current_LN = -Read_Encoder(3);
  Current_RN = Read_Encoder(4);

  *CurrentVelcity_L = (MPN * Current_LN * 1000 * 10)/T;//單位:mm/s
  *CurrentVelcity_R = (MPN * Current_RN * 1000 * 10)/T;

  printf("The Current Left Wheel Velocity is: %d mm/s.\\r\\n",*CurrentVelcity_L);
  printf("The Current Right Wheel Velocity is: %d mm/s.\\r\\n",*CurrentVelcity_R);

}

3.測試結果

圖片

05 總結

注意:左輪電機和右輪電機是相反的,需要實際測試確定,比如我這里,向前走的時候,右輪是正轉,這時左輪反轉的時候才是前進,在編寫程序時需要給左輪的脈沖值加個負號。

獲取到了實時速度值后,就可以用PID算法對電機轉速進行準確控制了。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 傳感器
    +關注

    關注

    2548

    文章

    50740

    瀏覽量

    752142
  • 編碼器
    +關注

    關注

    45

    文章

    3601

    瀏覽量

    134201
  • STM32
    +關注

    關注

    2266

    文章

    10876

    瀏覽量

    354925
  • PID
    PID
    +關注

    關注

    35

    文章

    1471

    瀏覽量

    85306
  • STM32F103C8T6
    +關注

    關注

    107

    文章

    160

    瀏覽量

    83281
收藏 人收藏

    評論

    相關推薦

    有關AB相磁編碼器STM32F103C8T6之間脈沖計數問題

    AB相磁編碼器STM32F103C8T6引腳應該怎么連接?我看手冊通用定時四個通道都可以實現輸入捕獲功能,那是否能實現
    發表于 09-17 12:29

    深圳高價回收STM32F103C8T6 收購STM32F103C8T6

    [[ ST芯片大量收購STM32F103C8T6 ,高價回收意ST電子芯片,實力回收電子芯片,高價回收各個品牌電子芯片 ]]優勢回收以下ST型號:STM32F101C6T6
    發表于 08-30 16:10

    MT測速單片機程序設計

    MT測速單片機程序設計MT
    發表于 09-02 06:01

    如何實現STM32F103C8T6編碼器測速

    如何實現STM32F103C8T6編碼器測速
    發表于 12-13 07:21

    STM32F103C8T6最小系統原理圖

    本文件是關于意半導體公司研制的STM32F103C8T6最小系統的電路原理圖,供單片機學習使用。
    發表于 04-25 17:07 ?302次下載

    STM32F103C8T6引腳圖

    本文介紹STM32F103C8T6引腳圖、STM32F103C8T6開發板電路圖及各部分引腳功能圖介紹,STM32F103C8T6資料下載。
    發表于 08-03 15:53 ?43.8w次閱讀
    <b class='flag-5'>STM32F103C8T6</b>引腳圖

    STM32F103C8T6核心板的資料合集免費下載

    本文檔的主要內容詳細介紹的是STM32F103C8T6核心板的資料合集免費下載包括了:STM32F103C8T6核心板測試程序(PC13閃爍),STM32F103C8T6核心板測試程序(RTC
    發表于 06-04 08:00 ?720次下載
    <b class='flag-5'>STM32F103C8T6</b>核心板的資料合集免費下載

    STM32F103C8T6原理圖

    STM32F103C8T6原理圖免費下載。
    發表于 06-02 10:01 ?177次下載

    STM32F103C8t6程序下載

    STM32F103C8t6程序下載
    發表于 11-24 18:21 ?231次下載
    <b class='flag-5'>STM32F103C8t6</b>程序下載

    STM32F103C8T6中斷特征介紹 用按鈕為STM32 MCU觸發一個中斷

    中斷是MCU的特征之一,STM32F103C8T6也不例外。以下通過STM32F103C8T6 Blue Pill外接一個按鈕,向MCU觸發外部中斷
    的頭像 發表于 05-17 08:57 ?1.1w次閱讀
    <b class='flag-5'>STM32F103C8T6</b><b class='flag-5'>中斷</b>特征介紹 用按鈕為<b class='flag-5'>STM32</b> MCU觸發一個<b class='flag-5'>中斷</b>

    STM32F103C8T6微控制手冊

    STM32F103C8T6微控制手冊免費下載。
    發表于 05-24 16:05 ?48次下載

    使用stm32f103c8t6設計的藍牙小車

    使用stm32f103c8t6設計的藍牙小車,具有前進后退,左轉右轉等功能
    發表于 08-07 16:08 ?28次下載

    ch32f103c8t6stm32f103c8t6的區別

    ch32f103c8t6stm32f103c8t6的區別 STM32F103C8T6是一款32位微處理,屬于STM32F1系列中的一員。
    的頭像 發表于 08-22 16:05 ?9371次閱讀

    分享STM32F103C8T6原理圖

    STM32F103C8T6最小系統原理圖
    發表于 08-29 15:52 ?101次下載

    stm32f103c8t6怎么連接噪聲傳感

    連接噪聲傳感STM32F103C8T6需要以下步驟: 確定傳感STM32F103C8T6之間的連接接口。噪聲傳感通常使用模擬信號輸
    的頭像 發表于 12-21 16:10 ?1404次閱讀