找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

bascom avr版仿真PID控制直流電機(jī)的例子

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
本帖最后由 taotie 于 2021-5-13 14:20 編輯



程序:
rem Main.bas file generated by New Project wizard
rem
rem Created:   周日 5月 9 2021
rem Processor: ATmega8
rem Compiler:  BASCOM-AVR

rem Write your code here

'------------------------------------------------------------------------------
'name                     : PID速度控制
'copyright                : (c) 2009 by Türk Mario
'purpose                  : 直流電動(dòng)機(jī)的速度控制
'
'micro                    : Mega8
'------------------------------------------------------------------------------
$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 32
$swstack = 8
$framesize = 24
$baud = 9600
Config Pinb.0 = Output                                      'LED
Config Pinb.3 = Output                                      'PWM
Config Pinc.0 = Output                                      '方向
Config Pinc.1 = Output                                      '方向
Config Pind.2 = Input
Portd.2 = 1                                                 '激活上拉
Config Portd.0 = Input                                      '串口輸入
Portd.0 = 1
Dim E As Single
Dim Esum As Single
Dim Ealt As Single
Dim Kp As Single
Dim Ki As Single
Dim Kd As Single
Dim Ta As Single
Dim Proportionalteil As Single  '比例部分為單精度
Dim Integralteil As Single       '積分 部分為單精度'
Dim Differentialteil As Single    '微分部分為單精度
Dim Cv As Single
Dim Gv As Single
Dim Flanken As Integer                                      '計(jì)入側(cè)翼
Dim Flankenperturn As Integer                               '每圈側(cè)翼數(shù)
Dim Umdrehungen As Single
Dim Solldrehzahl As Single                                  '目標(biāo)速度
Dim Maxdrehzahl As Single                                       '最大速度
Dim Befehl As String * 9                                    '指令
Dim Bcount As Integer                                       '計(jì)數(shù)
Dim Ar(5) As String * 5
Kp = 60
Ki = 8
Kd = 0.2
Ta = 0.04
Solldrehzahl = 10 '目標(biāo)速度
Maxdrehzahl = 50   '最大速度
Flankenperturn = 30  '每圈側(cè)翼數(shù)
E = 0
Esum = 0
Ealt = 0
Config Int0 = Falling                                       '下降沿觸發(fā)中斷
Enable Interrupts
Enable Int0
On Int0 Encoder_zaehlen                                     '發(fā)生中斷時(shí)觸發(fā)編碼器計(jì)數(shù)
Config Timer1 = Timer , Prescale = 256                      'Timer1每40ms執(zhí)行一次調(diào)節(jié)
On Timer1 Regler
Timer1 = 64285                                              ' 65535 - (8000000/256/Ta)   Ta = 25
Enable Timer1
Start Timer1
                                                             '定時(shí)器2負(fù)責(zé)電機(jī)PWM
Config Timer2 = Pwm , Compare Pwm = Clear Up , Pwm = On , Prescale = 64
   Ocr2 = 30
   '指定方向:
   Portc.0 = 1
   Portc.1 = 0
   '啟動(dòng)PWM電機(jī)
   Enable Timer2
   Start Timer2
'$sim
Do                                                          '主程序
Input "" , Befehl
Bcount = Split(befehl , Ar(1) , ": ")     '將字符串拆分為多個(gè)數(shù)組元素。計(jì)數(shù)=拆分(源、數(shù)組(idx)、搜索)
   If Ar(1) = "Kp" Then                                     '設(shè)置和信息選項(xiàng)
          Kp = Val(ar(2))
   End If
    If Ar(1) = "Ki" Then
          Ki = Val(ar(2))
   End If
    If Ar(1) = "Kd" Then
          Kd = Val(ar(2) )
   End If
   If Ar(1) = "soll" Then
   Solldrehzahl = Val(ar(2))
   End If
    If Ar(1) = "max" Then
   Maxdrehzahl = Val(ar(2))
   End If
   If Ar(1) = "rps" Then
        Print Umdrehungen
   End If
    If Ar(1) = "pid" Then
        Print "Kp=" ; Kp
        Print "Ki=" ; Ki
        Print "Kd=" ; Kd
   End If
    If Ar(1) = "pwm" Then
        Print Ocr2
    End If
Loop
Encoder_zaehlen:                                            '所有邊緣都在這里計(jì)算
Incr Flanken
Return
Regler:                                                     'PID控制器算法
Timer1 = 64285
Umdrehungen = Flanken / Ta                                  '確定每秒的轉(zhuǎn)數(shù)
Umdrehungen = Umdrehungen / Flankenperturn
Flanken = 0                                                 '將邊緣計(jì)數(shù)器設(shè)置為零
E = Solldrehzahl - Umdrehungen                              '計(jì)算控制偏差
Esum = Esum + E                                             '加總錯(cuò)誤
Proportionalteil = Kp * E                                   '計(jì)算比例項(xiàng)
Integralteil = Ki * Ta                                      '計(jì)算積分項(xiàng)
Integralteil = Integralteil * Esum
Differentialteil = E - Ealt                                 '計(jì)算微分項(xiàng)
Differentialteil = Differentialteil / Ta
Differentialteil = Differentialteil * Kd
Cv = Proportionalteil + Integralteil                        '匯總所有鏈接
Cv = Cv + Differentialteil
Gv = Maxdrehzahl / 255                                      '轉(zhuǎn)移到PWM占空比
Gv = Gv * Cv
If Gv < 0 Then Gv = 0
If Gv > 255 Then Gv = 255
Ocr2 = Gv                                    '電機(jī)PWM進(jìn)行了相應(yīng)的調(diào)整
Ealt = E                                                    '注意下一次運(yùn)行的規(guī)則錯(cuò)誤
Return

工程文件:用8.9版打開
新建文件夾 (3).zip (205.6 KB, 下載次數(shù): 14)


評分

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

查看全部評分

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

使用道具 舉報(bào)

沙發(fā)
ID:830831 發(fā)表于 2021-5-15 15:26 | 只看該作者
結(jié)果如何? 可能分析一下?
回復(fù)

使用道具 舉報(bào)

板凳
ID:342822 發(fā)表于 2021-5-15 17:46 | 只看該作者
本帖最后由 taotie 于 2021-5-16 15:29 編輯
Highnose 發(fā)表于 2021-5-15 15:26
結(jié)果如何? 可能分析一下?

筆記本沒有COM口


屏幕截圖(69).png (127.35 KB, 下載次數(shù): 142)

屏幕截圖(69).png
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

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