找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2638|回复: 2
打印 上一主题 下一主题
收起左侧

bascom avr版仿真PID控制直流电机的例子

[复制链接]
跳转到指定楼层
楼主
本帖最后由 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                  : 直流电动机的速度控制
'
'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                                      '计入侧翼
Dim Flankenperturn As Integer                               '每圈侧翼数
Dim Umdrehungen As Single
Dim Solldrehzahl As Single                                  '目标速度
Dim Maxdrehzahl As Single                                       '最大速度
Dim Befehl As String * 9                                    '指令
Dim Bcount As Integer                                       '计数
Dim Ar(5) As String * 5
Kp = 60
Ki = 8
Kd = 0.2
Ta = 0.04
Solldrehzahl = 10 '目标速度
Maxdrehzahl = 50   '最大速度
Flankenperturn = 30  '每圈侧翼数
E = 0
Esum = 0
Ealt = 0
Config Int0 = Falling                                       '下降沿触发中断
Enable Interrupts
Enable Int0
On Int0 Encoder_zaehlen                                     '发生中断时触发编码器计数
Config Timer1 = Timer , Prescale = 256                      'Timer1每40ms执行一次调节
On Timer1 Regler
Timer1 = 64285                                              ' 65535 - (8000000/256/Ta)   Ta = 25
Enable Timer1
Start Timer1
                                                             '定时器2负责电机PWM
Config Timer2 = Pwm , Compare Pwm = Clear Up , Pwm = On , Prescale = 64
   Ocr2 = 30
   '指定方向:
   Portc.0 = 1
   Portc.1 = 0
   '启动PWM电机
   Enable Timer2
   Start Timer2
'$sim
Do                                                          '主程序
Input "" , Befehl
Bcount = Split(befehl , Ar(1) , ": ")     '将字符串拆分为多个数组元素。计数=拆分(源、数组(idx)、搜索)
   If Ar(1) = "Kp" Then                                     '设置和信息选项
          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:                                            '所有边缘都在这里计算
Incr Flanken
Return
Regler:                                                     'PID控制器算法
Timer1 = 64285
Umdrehungen = Flanken / Ta                                  '确定每秒的转数
Umdrehungen = Umdrehungen / Flankenperturn
Flanken = 0                                                 '将边缘计数器设置为零
E = Solldrehzahl - Umdrehungen                              '计算控制偏差
Esum = Esum + E                                             '加总错误
Proportionalteil = Kp * E                                   '计算比例项
Integralteil = Ki * Ta                                      '计算积分项
Integralteil = Integralteil * Esum
Differentialteil = E - Ealt                                 '计算微分项
Differentialteil = Differentialteil / Ta
Differentialteil = Differentialteil * Kd
Cv = Proportionalteil + Integralteil                        '汇总所有链接
Cv = Cv + Differentialteil
Gv = Maxdrehzahl / 255                                      '转移到PWM占空比
Gv = Gv * Cv
If Gv < 0 Then Gv = 0
If Gv > 255 Then Gv = 255
Ocr2 = Gv                                    '电机PWM进行了相应的调整
Ealt = E                                                    '注意下一次运行的规则错误
Return

工程文件:用8.9版打开
新建文件夹 (3).zip (205.6 KB, 下载次数: 12)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:830831 发表于 2021-5-15 15:26 | 只看该作者
结果如何? 可能分析一下?
回复

使用道具 举报

板凳
ID:342822 发表于 2021-5-15 17:46 | 只看该作者
本帖最后由 taotie 于 2021-5-16 15:29 编辑
Highnose 发表于 2021-5-15 15:26
结果如何? 可能分析一下?

笔记本没有COM口


屏幕截图(69).png (127.35 KB, 下载次数: 108)

屏幕截图(69).png
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表