无刷直流电机控制器的软件设计(编辑修改稿)内容摘要:

K=0; TMOD=0x02,开定时器 0和 1中断,置 139us定时器初值 1TH1=31,TL1=128,置定时器 0的 278us 计数初值; TH0=0x00,TL0=0x00清零显示速度,开定时器 0;第二,只有当启动键按下时才能进入其他按键查询工作,电机才可能有正转、反转、加速、停止等工作状态,否则程序会一直查询启动键,直 到其被按下才进入下一个操作;第三,当 140MS 计时完成时,接收到来自中断服务程序中的 temp=1 的信号,开始计算速度值 sd,计算公式为sd=((count/12)/140)*1000(单位是转 /秒 ),并且将开始计算速度标志位 temp 置为0,计时计数变量 T0_count=0,霍尔改变次数计数变量 count=0。 正反转程序流程图 表 41 正转霍尔状态与控制字对应关系表 霍尔状态 101 100 110 010 011 001 hall 值 0x05 0x04 0x06 0x02 0x03 0x01 控制字 0x13 0x07 0x0d 0x1c 0x34 0x31 表 42 反转霍尔状态与控制字对应关系表 霍尔状态 101 001 011 010 110 100 hall 值 0x05 0x01 0x03 0x02 0x06 0x04 控制字 0x1c 0x0d 0x07 0x13 0x31 0x34 图 42 正转流程图 Z_ZHUAN() 通过 switch查询获得相应控制字赋给 P1口 开始 返回到主程序 南昌航空大学学士学位论文 16 定义变量 i=0,将两个值进行分离分别得到个、十位 开始 {switch(hall) { case 0x05: P1=0x13。 break。 case 0x04: P1=0x07。 break。 case 0x06: P1=0x0d。 break。 case 0x02: P1=0x1c。 break。 case 0x03: P1=0x34。 break。 case 0x01: P1=0x31。 break。 default: P1=0x15。 break。 } } 采用手动转电机转轴的方式确定电机转动的霍尔状态变换顺序,电机在 180176。 内霍尔状态改变六次,自定义电机逆时针转为正转,在正转子程序中, hall 是代表霍尔状态的变量,电机不停地转动,霍尔状态在不断的改变, hall 有 0x0 0x00x0 0x0 0x0 0x01 六个值。 通过不停地查询霍尔状态得到 hall 当前的值,再运用 switch~ case 语句查表获取控制字送到 P1 口低六位以控制功率管。 这样循环操作,以达到控制电机的转动和换相。 定义电机顺时针转为反转,反转原理与正转类似,只是控制字不同,具体可以参照表 42。 当有正转键按下时,置正转标志flag_z=1,有反转键按下时 置 flag_z=0,在工作子程序( G_ZUO())中判断若 flag_z=1,转到正转子程序执行,当 flag_z=0 时转到反转子程序执行。 显示子程序流程图 接 74ls48 芯片的四个输入端控制数码管的段选通, 输出电机控制字,经光耦隔离后到 ir2103 驱动芯片的输入端,控制功率管的导通, 接三个霍尔信号, 接蜂鸣器(起报警作用), 为 PWM 波的输出端, 接 74ls138 译码器的输入端,控制数码管的位选通。 给控制译码器的 P0口赋给相应的值 四位一体数码管显示相应的值 返回 四位数据显示完成否 ? N Y 南昌航空大学学士学位论文 17 图 43显示子程序流程图 表 43 74ls48 译码器真值表 分析:四位一体数码管显示比用八段数码管显示要简单,设定前两个数码管显示状态指示值(其中 11表示启动, 00表示停止, 01表示正转, 02表示反转, 03表示逐步加速, 04表示获取固定速度),后两位用来显示当前速度值(速度单 位是转 /秒)。 状态指示值和速度值通过参数的形式送来赋给形参 zhi_s、 sudu, tempdata[]是存放四位数据的数组,由 zhi_s/10 获得状态指示值的十位存放在 tempdata[0]中,由 (zhi_s%10)获得其位值存放在 tempdata[1]中;由 sudu/10 获得速度值的十位存放在 tempdata[2]中;由 sudu%10获得个位值存放在 tempdata[3]中。 通过查tablewe[]表获得位码 tablewe[i], 查 tempdata[]表获得段码 tempdata[i],令P0=tempwe[i]|tempdata[i]每显示完一位(如个位)变量 i 就加 1,以达到动态显示的效果。 十进制 输入 BI/RB0 输出 LT RBI DCBA a b c d e f g 0 H H 0000 H 1 1 1 1 1 1 0 1 H X 0001 H 0 1 1 0 0 0 0 2 H X 0010 H 1 1 0 1 1 0 1 3 H X 0011 H 1 1 1 1 0 0 1 4 H X 0100 H 0 1 1 0 0 1 1 5 H X 0101 H 1 0 1 1 0 1 1 6 H X 0110 H 0 0 1 1 1 1 1 7 H X 0111 H 1 1 1 0 0 0 0 8 H X 1000 H 1 1 1 1 1 1 1 9 H X 1001 H 1 1 1 0 0 1 1 南昌航空大学学士学位论文 18 图 44 正转状态显示图南昌航空大学学士学位论文 19 图 45 反转状态显示图 中断服务程序及其流程图 从换相过程中的转矩脉动角度来看, H_PWML_PWM 方式的转矩脉动最大,以及根据老师的建议,因此选择 H_PWML_PWM 方式进行调速控制。 定时器 0中断服务程序: void timer0( ) interrupt 1//278US 自动重装 { PWM=1。 TR1=1。 hall=0x07amp。 P2。 if(hall!=hall_1) { count++。 hall_1=hall。 } if(T0_count=504)T0_count++。 //140ms 未到 else temp=1。 } 定时器 1中断 服务程序: void timer1( ) interrupt 3//初始 139us { TR1=0。 t1=0。 if(PWMZK=31) { PWMZK=0。 } TH1=31PWMZK。 TL1=119PWMZK。 南昌航空大学学士学位论文 20 定时器 1 中断入口 定时器中断 0 入口 返回 定时满 140ms 否。 开定时器 1, PWM 波输出高,读取霍尔状态值 记录霍尔状态改变次数 ,并将当前状态值存在霍尔比较变量中 } 图 46 定时器 0 中断服务程序流程图 图 47 定时器 1 中断服务程序流程图 分析:用定时器 0和 1同时进行来获得周期一定(为 278US)的 pwm 波 ,用定时器 0作为 278us 的标尺,在定时器 0的中断服务程序中获取霍尔信号,获取霍尔状态值的方式是 P2amp。 0x07,即取 P2口的第三位,并比较其是否改变,记录改变次数存于霍尔状态改变否。 Y N N Y 定时次数 T0_count加 1 返回 关定时器 1, PWM 波的输出为低 重新赋给定时器 1计数初值 置 temp标志位为 1 南昌航空大学学士学位论文 21 count 中;测速方式是记录一定时间(本设计为 140ms)内霍尔状态改变的次数,根据电机转一圈改变霍尔状态 12次的规律可测出速度值,当定时器 0定时次数T0_count 值达到 504 次(即满 140ms)时令开始计算速度标志位 temp=1,进入到主程序中计算速度值。 定时器 1 的计数初值 TH1=31PWMZK, TL1=128PWMZK;当 变量PWMZK 的值发生改变时,定时器 1的定时时间也就发生改变,即 PWM 波输出高电平脉宽发生改变,这样就可以改变功率管的平均电压,从而改变其平均电流已达改变速度之效。 加速模块 介绍 if(s4==0) { delay(10)。 if(s4==0)PWMZK++。 } 图 48 加速子程序流程图 分析:若有加速键按下, PWMZK 值加 1,根据 定时器 1 赋计数初值的方式TH1=31PWMZK, TL1=128PWMZK 可知, pwm 波输出高电平时间就增长,功率管导通时间增长, 140ms 内霍尔信号改变的次数 count 值增大,速度值 sd随之增大,显示值就相应改变了,根据数码管显示可知速度改变的大小。 如下是加速前后的比较图 开始 返回 加速键按下 PWM 波高电平持续时间增长 南昌航空大学学士学位论文 22 图 49 未启动显示图 图 410 启动后显示图 图 411 加速后显示图 图 412 特定速度值键按下后显示图 if(s0==0) { delay(10)。 if((s0==0)amp。 amp。 (flag_z!=2)) { PWMZK=20。 flag_j=0。 } } 南昌航空大学学士学位论文 23 图 413 固定速度值程序流程 图 分析:任何加速状态的前提是处在正转或反转的情况下,因此必须 flag_z 标志要有效。 起初的加速键只能在较小程度上进行加速操作,为达到快速到一定转速的目的,本设计在按键设计部分增加了固定速度按键 S0,当该按键按下时,负责调节脉宽的变量 PWMZK 直接变为 20,定时器 1 就可以得到固定的计数初值,这样就能获得某个设定的转速,通过计算,可以得到此时相应的速度。 按键查询子程序及其流程图 独立按键查询程序比较简单,下面是一个按键的查询代码,其他键类似。 if(s2==0) { delay(10)。 if(s2==0)flag_z=1。 } 分析:按键查询子程序流程图如图 414,程序中,主要做的事就是判断按键是否按下,根据按下的键置相应的标志位,这样在工作子程序( G_ZUO())中根据相应的标志位转到对应的子程序中执行。 本设计中,正反转标志位使用同一个 flag_z,这样就避免了在反转程序中将正转标志位置 0,在正转程序中将反转标志位置 0,减小了出错概率。 当有停止键按下时,设定停止标志位,后进入相应的工作子程序。 开。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。