冰楓論壇

 找回密碼
 立即註冊
搜索
查看: 3386|回覆: 0
打印 上一主題 下一主題

[討論] LPC11U66微控制器 電機控速器

[複製鏈接]

2609

主題

0

好友

1003

積分

金牌會員

Rank: 6Rank: 6

UID
373967
帖子
9008
主題
2609
精華
0
積分
1003
楓幣
0
威望
980
存款
35891
贊助金額
0
推廣
0
GP
1205
閱讀權限
70
在線時間
460 小時
註冊時間
2023-1-12
最後登入
2024-12-22

2023端午節紀念勳章 2023中秋節紀念勳章 2023聖誕節紀念勳章

跳轉到指定樓層
1
發表於 2023-5-9 18:41:25 |只看該作者 |倒序瀏覽
要製作LPC11U66微控制器電機控速器,同時顯示設定速度和即時速度,你需要以下的零件和連結腳位:

零件:

LPC11U66微控制器:這是一款基於ARM Cortex-M0核心的微控制器,具有內建的ADC、PWM和UART等功能,可以用於控制電機速度。
電機驅動器:根據你所使用的電機類型(直流馬達或步進馬達),選擇適合的電機驅動器。
電機:根據你的需求選擇適合的電機。
速度感測器:用於感測電機的即時速度。可以使用光編碼器或霍爾效應傳感器等。

連結腳位:

將LPC11U66的PWM輸出連接到電機驅動器的控制輸入。這個腳位用於控制電機的轉速。
將速度感測器的輸出連接到LPC11U66的ADC輸入。這個腳位用於讀取電機的即時速度。
如果使用UART顯示速度,將LPC11U66的UART輸出連接到顯示設備(如LCD顯示屏)。

程式碼:
以下是示例程式碼,用於控制電機速度並同時顯示設定速度和即時速度。
可能需要根據具體的需求進行修改和擴展。


#include "LPC11Uxx.h"

#define TARGET_SPEED 100  // 設定的目標速度

void initPWM()
{
    LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 8);  // 啟用PWM時鐘

    // 設定PWM輸出引腳
    LPC_IOCON->PIO1_6 &= ~0x07;  // 清除PIO1_6的功能
    LPC_IOCON->PIO1_6 |= 0x02;   // 配置PIO1_6為PWM1_1輸出

    // 設定PWM定時器
    LPC_PWM1->MR0 = 1000;    // PWM週期為1000
    LPC_PWM1->MR1 = 0;       // 初始速度為0
    LPC_PWM1->MCR = 0x02;    // 重置計數器
    LPC_PWM1->LER = 0x03;    // 更新PWM0和PWM1的值
    LPC_PWM1->PCR = 0x0200;  // 啟用PWM1輸出通道

    LPC_PWM1->TCR = 0x09;    // 啟用PWM計數器和PWM模式
}

void initADC()
{
    LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 13);  // 啟用ADC時鐘

    // 設定ADC輸入引腳
    LPC_IOCON->R_PIO1_0 &= ~0x07;  // 清除R_PIO1_0的功能
    LPC_IOCON->R_PIO1_0 |= 0x01;   // 配置R_PIO1_0為ADC輸入

    LPC_ADC->CR = (1 << 0) |     // 啟用ADC電源
                  (1 << 1) |     // 啟用ADC功能
                  (24 << 8) |    // 設定ADC時鐘分頻為24
                  (1 << 21);     // 啟用ADC通道0

    LPC_ADC->INTEN = 0;          // 禁用ADC中斷
}

void setMotorSpeed(uint32_t speed)
{
    // 將設定速度轉換為PWM脈衝寬度
    uint32_t pulseWidth = speed * LPC_PWM1->MR0 / 100;

    // 更新PWM1的值
    LPC_PWM1->MR1 = pulseWidth;
    LPC_PWM1->LER = 0x02;    // 更新PWM1的值
}

uint32_t getMotorSpeed()
{
    // 讀取ADC值,並將其轉換為速度
    uint32_t adcValue = (LPC_ADC->DR[0] >> 4) & 0xFFF;
    uint32_t speed = adcValue * 100 / 4095;

    return speed;
}

int main()
{
    initPWM();    // 初始化PWM
    initADC();    // 初始化ADC

    while (1)
    {
        uint32_t targetSpeed = TARGET_SPEED;
        uint32_t currentSpeed = getMotorSpeed();

        setMotorSpeed(targetSpeed);

        // 在顯示設備上顯示設定速度和即時速度
        // 這裡假設你已經有相應的顯示函數

        // 延遲一段時間,可以使用延遲函數或計時器來實現
    }
}
收藏收藏0 推0 噓0


把本文推薦給朋友或其他網站上,每次被點擊增加您在本站積分: 1鑰匙
複製連結並發給好友,以賺取推廣點數
簡單兩步驟,註冊、分享網址,即可獲得獎勵! 一起推廣文章換商品、賺$$
高級模式
B Color Image Link Quote Code Smilies |上傳

廣告刊登意見回饋關於我們管群招募本站規範DMCA隱私權政策

Copyright © 2011-2024 冰楓論壇, All rights reserved

免責聲明:本網站是以即時上載留言的方式運作,本站對所有留言的真實性、完整性及立場等,不負任何法律責任。

而一切留言之言論只代表留言者個人意見,並非本網站之立場,用戶不應信賴內容,並應自行判斷內容之真實性。

小黑屋|手機版|冰楓論壇

GMT+8, 2024-12-22 09:05

回頂部