直流电机调速系统课程设计报告.docx
《直流电机调速系统课程设计报告.docx》由会员分享,可在线阅读,更多相关《直流电机调速系统课程设计报告.docx(24页珍藏版)》请在冰豆网上搜索。
直流电机调速系统课程设计报告
直流电机调速系统
设计报告
题目:
H桥&串口输出
2016年3月
一、设计任务
设计并制作一套直流电机调速系统,主要包括两部分:
主电路部分和以单片机为核心的控制电路部分。
要求设计、制作控制电路和主电路,实现如下功能:
(1)通过码盘和光耦得到一系列脉冲,利用M法、T法或M/T法对这些脉冲在单片机中进行处理得到电机的转速,在液晶或数码管上进行显示;
(2)DC/DC电路能够正常工作,通过旋钮或键盘设定转速,并能够通过电力电子电路输出合适的电压,使电机的转速达到设定转速。
(3)实验室提供24V直流电源为DC/DC电路供电,其余部分电源请利用220V市电自行设计。
图1系统总体框图
二、硬件电路设计与制作
2.1显示部分电路设计
使用计数器采集到电机转速后,需要用数码管进行显示。
我们组选择串口驱动数码管显示电路,74HC595芯片是一种串入并出的芯片,是8位串行输入/输出或者并行输出移位寄存器,具有高阻、关、断状态。
首先使用三极管构成驱动电路,驱动数码管。
采用单片机的P0.0-P0.2作为74HC595时钟信号与输入口,使数码管显示相应转速,具体实现电路如图1。
图1显示电路原理图
2.2驱动部分电路设计
驱动部分作为电机与单片机控制器的结合部分,是本次设计的主电路,需要完成DC/DC变化的功能。
单片机产生PWM波送给驱动芯片IR2110,2110通过驱动电路控制MOSFET开关改变加在直流电机上的电压,从而达到改变转速的目的。
单片机产生的PWM1和PWM2波形要相反,控制斩波电路的半桥互补通断。
电路设计图如图2所示。
图2驱动电路原理图
2.3电源部分设计
电源设计部分共分两个部分,一部分是IR2110的供电电压和所有芯片的供电电压,另一部分是USB口供电电部分,使用电脑供电,两部分电路通过拨码开关进行切换。
市电供电电源采用220V交流电变成15V交流电,经整流桥变成直流电,再经7815、7805稳压得到15V和5V直流电,分别给驱动和单片机系统供电。
图3市电电源设计图
图4mini-USB供电接口图
2.4单片机系统设计
本设计采用STC15W4K48S4型号单片机,使用它的计数功能、定时器功能、数码管驱动功能、PWM波输出功能进行设计制作。
图5单片机管脚功能图
图6单片机最小系统原理图
图7单片机管脚使用示意图
2.5转速反馈设计
此次设计使用单片机的P3.4口作为计数器使用。
图8A/D采集和转速反馈电路图
2.6硬件电路焊接图
图9硬件电路焊接图
三、软件设计与编程
3.1主要程序流程
图10主要程序流程图
3.2完整程序
见附录
四、测试结果
上电后,电机运转正常,调节键盘后后,电机转速随之变化,数码管显示显示转速也随之变化,但是反转时程序中转速调节的P值过大,导致电机转速正负跳变,没有实现闭环控制。
五、课程设计中遇到的问题及解决方法
问题一整体硬件电路的设计原理不清楚,对于电路设计没有信心。
解决方法:
通过不断查阅资料,焊电路过程中不断修改电路才得到正确的电路。
问题二IR2110的1和7脚PWM波不能正常输出,DC/DC电路不输出。
解决方法:
后来经过排查电路,发现主要有两个问题,第一个问题是芯片的5脚没有和IRF540的半桥臂连起来,另一个问题是24V和5V电源的地没有共起来,把这两个问题解决了,电路可以正常工作。
六、课程设计感悟
本次课程设计是内容是通过单片机控制驱动电路,改变加在直流电机上的电压,从而达到调节电机转速的目的。
通过此次课程设计,使我更加扎实的掌握了有关直流电机调速方面的知识。
在设计过程中遇到了一些问题,比如设计电路不知如何下手,电阻电容的选取只会照搬经典电路,却不会灵活应用,后来经过多次查找资,问题才得到解决。
每次的课程设计都使我感觉到:
我知识掌握的不够扎实,学会的知识不会应用,思想上总是存在侥幸心理,对一个电路不加验证就想着可以应用。
实践出真知,通过亲自动手制作,使我们掌握的知识不再是纸上谈兵,以后要多多联系吧,毕竟这样的机会是少之又少。
我认为,这次课程设计不仅培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高。
这是日后最实用的,真的是受益匪浅。
要面对社会的挑战,只有不断的学习、实践,再学习、再实践。
这对于我们的将来也有很大的帮助。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力
此次设计也让我明白了思路即出路,有什么不懂不明白的地方要及时请教或上网查询,只要认真钻研,动脑思考,动手实践,就没有弄不懂的知识。
七、附录
附录1
7.1重要芯片资料
1.74HC595芯片
74HC595芯片是一种串入并出的芯片,在电子显示屏制作当中有广泛的应用。
595是具有8位移位寄存器和一个存储器,三态输出功能。
移位寄存器和存储器是分别的时钟。
数据在SCHcp的上升沿输入,在STcp的上升沿进入到存储寄存器中去。
如果两个时钟连在一起,则移位寄存器总是比存储寄存器早一个脉冲。
移位寄存器有一个串行移位输入(Ds),和一个串行输出(Q7),和一个异步的低电平复位,存储寄存器有一个并行8位的,具备三态的总线输出,当使能OE时(为低电平),存储寄存器的数据输出到总线。
图174HC595引脚图
管脚编号
管脚名
管脚定义功能
1、2、3、4、5、6、7、15
QA—QH
三态输出管脚
8
GND
电源地
9
SQH
串行数据输出管脚
10
SCLR
移位寄存器清零端
11
SCK
数据输入时钟线
12
RCK
输出存储器锁存时钟线
13
OE
输出使能
14
SI
数据线
15
VCC
电源端
图274HC595管脚功能图
2.IR2110芯片
IR2110采用HVIC和闩锁抗干扰CMOS制造工艺,DIP14脚封装。
具有独立的低端和高端输入通道;悬浮电源采用自举电路,其高端工作电压可达500V,dv/dt=+50V/ns,15V下静态功耗仅116mv;输出的电源端电压范围10-20V;逻辑电源电压范围5-15V,可方便的与TTL、CMOS电平相匹配,而且逻辑电源地和功率之间允许有+5V的偏移量;工作频率高,可达500KHz;开通、关断延时小,分别为120ns和94ns;图腾柱输出峰值电流为2A。
图3IR2110直插式管脚图
附录二
7.2程序
7.2.1主程序
#include"config.h"
#include"Exti.h"
#include"timer.h"
#include"delay.h"
#include"GPIO.h"
#include"PWM.h"
/*************功能说明**************
******************************************/
/*************本地常量声明**************/
//u8codet_display[]={//标准字库
////0123456789ABCDEF
//0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
u8codet_display[]={//标准字库
//0123456789ABCDEF
0xD7,0x14,0xCD,0x5D,0x1E,0x5B,0xDB,0x15,0xDF,0x5F};//0.1.2.3.4.5.6.7.8.9.-1
unsignedcharcodeT_COM[]={0x80,0x40,0x20,0x10};//位码
//=====================================================================
//端口声明
//=====================================================================
//595的三个开关
sbitP_HC595_SER=P0^0;//pin14SERdatainput
sbitP_HC595_RCLK=P0^1;//pin12RCLkstore(latch)clock
sbitP_HC595_SRCLK=P0^2;//pin11SRCLKShiftdataclock
//转速测量的中断输入口INT0P3.2
//pwm1路分别为p2.5
//调节按钮,一路加,一路减
sbitadd_zhuansu=P0^3;//接的是第二个按钮,正常为高电平
sbitsub_zhuansu=P0^4;
//=====================================================================
//externbitB_Timer0_1ms;//中断是否结束,,如果时间到了则为1
u8LED8[4];//显示的数据数码管要显示的数据,1300,,,1,3,0,0
u8display_index;//显示位索引4322
/*************本地变量声明**************/
longintzhuansu=0;//测量到的转速
longintset_zhuansu=3600;//设定的转速
u8dir=1;//为正转
u16pwm0,pwm1,pwm2;
/*************外部函数和变量声明*****************/
externu32Pulse;
externu8PulseTimeOut;
/*******************外中断配置函数*******************************/
voidEXTI_config(void)
{
EXTI_InitTypeDefEXTI_InitStructure;//结构定义
EXTI_InitStructure.EXTI_Mode=EXT_MODE_Fall;//中断模式,EXT_MODE_RiseFall,EXT_MODE_Fall
EXTI_InitStructure.EXTI_Polity=PolityHigh;//中断优先级,PolityLow,PolityHigh
EXTI_InitStructure.EXTI_Interrupt=ENABLE;//中断允许,ENABLE或DISABLE
Ext_Inilize(EXT_INT0,&EXTI_InitStructure);//初始化INT0EXT_INT0,EXT_INT1,EXT_INT2,EXT_INT3,EXT_INT4
}
/*******************定时器配置函数*******************************/
voidTimer_config(void)
{
TIM_InitTypeDefTIM_InitStructure;//结构定义
TIM_InitStructure.TIM_Mode=TIM_16BitAutoReload;//指定工作模式,TIM_16BitAutoReload,TIM_16Bit,TIM_8BitAutoReload,TIM_16BitAutoReloadNoMask
TIM_InitStructure.TIM_Polity=PolityLow;//指定中断优先级,PolityHigh,PolityLow
TIM_InitStructure.TIM_Interrupt=ENABLE;//中断是否允许,ENABLE或DISABLE
TIM_InitStructure.TIM_ClkSource=TIM_CLOCK_12T;//指定时钟源,TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
TIM_InitStructure.TIM_ClkOut=DISABLE;//是否输出高速脉冲,ENABLE或DISABLE
TIM_InitStructure.TIM_Value=65536UL-((MAIN_Fosc)/(50*12));//初值,1000us,,,定时20ms,每秒50次
TIM_InitStructure.TIM_Run=ENABLE;//是否初始化后启动定时器,ENABLE或DISABLE
Timer_Inilize(Timer0,&TIM_InitStructure);//初始化Timer0Timer0,Timer1,Timer2
}
/*********************Timer0中断函数************************/
voidtimer0_int(void)interruptTIMER0_VECTOR
{
u16j,k;
k++;
if(k==50)//20*50ms
{
k=0;
zhuansu=Pulse/110*60;//110为齿轮数
Pulse=0;
j=zhuansu;
//j=pwm0;
//j=1234;
//if(set_zhuansu<0)
//j=-set_zhuansu;
//
//elsej=set_zhuansu;
LED8[0]=j/1000;
LED8[1]=j%1000/100;
LED8[2]=j%100/10;
LED8[3]=j%10;
//if(sub_zhuansu==0)
//{
//pwm0=pwm0-1000;
//}
//if(add_zhuansu==0)
//{
//pwm0=pwm0+1000;
//}
if(sub_zhuansu==0)
{
set_zhuansu=set_zhuansu-500;
}
if(add_zhuansu==0)
{
set_zhuansu=set_zhuansu+500;
}
//if(set_zhuansu<-2600)set_zhuansu=-2600;
//if(set_zhuansu>2600)set_zhuansu=2600;
//
//if(set_zhuansu>100)
//{
//pwm0=pwm0+(set_zhuansu-zhuansu)*0.2;//最大为8799
//}
//elseif(set_zhuansu<100)
//{
//pwm0=pwm0+(set_zhuansu+zhuansu)*0.2;
//}
//
//else
//{
//pwm0=0;//最大为8799
//}
if(set_zhuansu<0)set_zhuansu=0;
if(set_zhuansu>5200)set_zhuansu=5200;
pwm0=pwm0+(set_zhuansu-2600-zhuansu)*0.3;//最大为8799
if((set_zhuansu-2600<100)|(2600-set_zhuansu<100))
{
pwm0=0;//最大为8799
}
if(pwm0>8700)pwm0=8700;
if(pwm0<0)pwm0=0;
PWMx_SetPwmWide(PWM2_ID,pwm0,PERIOD);//红色指示灯由亮变暗再由暗变亮
PWMx_SetPwmWide(PWM3_ID,pwm0,PERIOD);//绿色指示灯由亮变暗再由暗变亮
}
}
//========================================================================
//函数:
voidPWM_config(void)
//描述:
PWM配置函数。
//参数:
none.
//返回:
none.
//版本:
VER1.0
//日期:
2014-8-15
//备注:
//========================================================================
voidPWM_config(void)
{
PWMx_InitDefinePWMx_InitStructure;//结构定义
PWMx_InitStructure.PWMx_IO_Select=PWM2_P27;//PWM输出IO选择.PWM6_P16,PWM6_P07,
PWMx_InitStructure.Start_IO_Level=0;//设置PWM输出端口的初始电平,0或1
PWMx_InitStructure.PWMx_Interrupt=DISABLE;//中断允许,ENABLE或DISABLE
PWMx_InitStructure.FirstEdge_Interrupt=DISABLE;//第一个翻转中断允许,ENABLE或DISABLE
PWMx_InitStructure.SecondEdge_Interrupt=DISABLE;//第二个翻转中断允许,ENABLE或DISABLE
PWMx_InitStructure.FirstEdge=PERIOD/2-12;/第一个翻转计数,1~32767
PWMx_InitStructure.SecondEdge=PERIOD/2+1-12;//第二个翻转计数,1~32767
PWMx_Configuration(PWM2_ID,&PWMx_InitStructure);//初始化PWM,PWM6_ID
P2n_standard(1<<7);//IO初始化,上电时为高阻
PWMx_InitStructure.PWMx_IO_Select=PWM3_P45;//PWM输出IO选择.PWM7_P17,PWM7_P06
PWMx_InitStructure.Start_IO_Level=1;//设置PWM输出端口的初始电平,0或1
PWMx_InitStructure.PWMx_Interrupt=ENABLE;//中断允许,ENABLE或DISABLE
PWMx_InitStructure.FirstEdge_Interrupt=ENABLE;//第一个翻转中断允许,ENABLE或DISABLE
PWMx_InitStructure.SecondEdge_Interrupt=DISABLE;//第二个翻转中断允许,ENABLE或DISABLE
PWMx_InitStructure.FirstEdge=PERIOD/2-12;//第一个翻转计数,1~32767
PWMx_InitStructure.SecondEdge=PERIOD/2+1-12;//第二个翻转计数,1~32767
PWMx_Configuration(PWM3_ID,&PWMx_InitStructure);//初始化PWM,PWM7_ID
P4n_standard(1<<5);//IO初始化,上电时为高阻
//TH2=(u8)((65536UL-MAIN_Fosc/500000UL)/256);//波特率使用Timer2
//TL2=(u8)((65536UL-MAIN_Fosc/500000UL)%256);//貌似定时2ms
//AUXR=0x14;//Timer2setAsTimer,Timer2setas1Tmode;
PWM_SourceClk_Duty(PwmClk_1T,PERIOD);//时钟源:
PwmClk_1T,PwmClk_2T,...PwmClk_16T,PwmClk_T2,PWM周期:
1~32767
PWMCR|=ENPWM;//使能PWM波形发生器,PWM计数器开始计数
//PWMCR&=~ECBI;//禁止PWM计数器归零中断
}
/**********************************************/
voidSend_595(unsignedchardat)//发送一个字节,,,,,,//上升沿发送数据
{
unsignedchari;
for(i=0;i<8;i++)
{
dat<<=1;
P_HC595_SER=CY;
P_HC595_SRCLK=1;
P_HC595_SRCLK=0;
}
}
/**********************************************/
#defineLED_TYPE0x00//定义LED类型,0x00--共阴,0xff--共阳这是一个共阳极数码管
voidDisplayScan(void)//显示扫描函数自动扫描的,当接受到数据后把数据更新给LED8[]即可
{
Send_595(T_COM[display_index]);//输出位码display_index=3,第3个位码为高
Send_595(LED_TYPE^t_display[LED8[display_index]]);//输出段码LED8[display_index]LED8[3]第3位的数据,所有的数据提前赋给了LED8[]
P_HC595_RCLK=1;
P_HC595_RCLK=0;//锁存输出数据
if(++displ