标题: 电机调唆程序 [打印本页]
作者: lifeng420922 时间: 2016-8-25 17:41
标题: 电机调唆程序
基于labview的PWM电机调速
一、简介:
此设计模拟工业控制现场,通过调节Labview界面中的模拟仪表,通过RS232串口通信,把转速控制信息通过串口传送到单片机中,进而利用单片机控制电动机的转速。
二、Labview前面板设计:
1.左部分为通讯端口、波特率、数据位、奇偶校验位、停止位、延时等选择端口。
2.中间为所调电压的PWM波形,图中蓝绿色所示。
3.右部分显示的是等效电压的大小,图中所示为2.35V。
4.下半部分为调节电压的仪表和确定按钮,当调节好电压,按下确定键后方能调节电机转速。
三、Labview程序框图:
1. 串口通讯部分:
2.PWM电压波形显示部分:
四、硬件设计:
单片机IO端口的电流太小,不足以驱动直流电机;本设计通过I0端口外接ULN2003AN驱动直流电动机。
五、单片机部分程序:
/*********************************************关于频率和占空比的确定,对于12M晶振,假定PWM输出频率为1KHZ,这样定时中断次数 *
*设定为C=10,即0.01MS中断一次,则TH0=FF,TL0=F6;由于设定中断时间为0.01ms,这样*
*可以设定占空比可从1-100变化。即0.01ms*100=1ms
******************************************************************************/
#include<reg52.h> //52单片机头文件
#include <intrins.h> //包含有左右循环移位子函数的库
#define uint unsigned int //宏定义
#define uchar unsigned char //宏定义
#define V_TH0 0XFF
#define V_TL0 0XF6
uchar ZKB1;
sbit P1_2=P1^2;
void init_sys(void); /*系统初始化函数*/
void main() //主函数
{
init_sys();
while(1)
{
/*对占空比值限定范围*/
if (ZKB1>99) ZKB1=1;
if (ZKB1<1) ZKB1=99;
}
}
void timer0(void) interrupt 1 using 2
{
static uchar click=0; /*中断次数计数器变量*/
TH0=V_TH0; /*恢复定时器初始值*/
TL0=V_TL0;
++click;
if (click>=100) click=0;
if (click<=ZKB1) /*当小于占空比值时输出低电平,高于时是高电平,从而实现占空比的调整*/
P1_2=1;
else
P1_2=0;
}
void ser() interrupt 4
{
RI=0;
ZKB1=SBUF;
}
/*系统初始化函数*/
void init_sys()
{
ZKB1=40;
TMOD=0x21;//设置定时器0工作方式1,定时器1为工作方式2
TH0=V_TH0; //定时0.01s
TL0=V_TL0;
TH1=0xF3; //波特率2400
TL1=0xF3;
REN=1; //允许串口接收数据
SM0=0;//串口工作方式1,8位数据传送
SM1=1;
EA=1;//开总中断
ES=1; //串口中断开
PS=1; //串口中断优先级最高
ET0=1;//开定时器0中断
TR1=1; //开波特率
TR0=1;//启动定时器0
}
基于labview的PWM电机调速
一、简介:
此设计模拟工业控制现场,通过调节Labview界面中的模拟仪表,通过RS232串口通信,把转速控制信息通过串口传送到单片机中,进而利用单片机控制电动机的转速。
二、Labview前面板设计:
1.左部分为通讯端口、波特率、数据位、奇偶校验位、停止位、延时等选择端口。
2.中间为所调电压的PWM波形,图中蓝绿色所示。
3.右部分显示的是等效电压的大小,图中所示为2.35V。
4.下半部分为调节电压的仪表和确定按钮,当调节好电压,按下确定键后方能调节电机转速。
三、Labview程序框图:
1. 串口通讯部分:
2.PWM电压波形显示部分:
四、硬件设计:
单片机IO端口的电流太小,不足以驱动直流电机;本设计通过I0端口外接ULN2003AN驱动直流电动机。
五、单片机部分程序:
/*********************************************关于频率和占空比的确定,对于12M晶振,假定PWM输出频率为1KHZ,这样定时中断次数 *
*设定为C=10,即0.01MS中断一次,则TH0=FF,TL0=F6;由于设定中断时间为0.01ms,这样*
*可以设定占空比可从1-100变化。即0.01ms*100=1ms
******************************************************************************/
#include<reg52.h> //52单片机头文件
#include <intrins.h> //包含有左右循环移位子函数的库
#define uint unsigned int //宏定义
#define uchar unsigned char //宏定义
#define V_TH0 0XFF
#define V_TL0 0XF6
uchar ZKB1;
sbit P1_2=P1^2;
void init_sys(void); /*系统初始化函数*/
void main() //主函数
{
init_sys();
while(1)
{
/*对占空比值限定范围*/
if (ZKB1>99) ZKB1=1;
if (ZKB1<1) ZKB1=99;
}
}
void timer0(void) interrupt 1 using 2
{
static uchar click=0; /*中断次数计数器变量*/
TH0=V_TH0; /*恢复定时器初始值*/
TL0=V_TL0;
++click;
if (click>=100) click=0;
if (click<=ZKB1) /*当小于占空比值时输出低电平,高于时是高电平,从而实现占空比的调整*/
P1_2=1;
else
P1_2=0;
}
void ser() interrupt 4
{
RI=0;
ZKB1=SBUF;
}
/*系统初始化函数*/
void init_sys()
{
ZKB1=40;
TMOD=0x21;//设置定时器0工作方式1,定时器1为工作方式2
TH0=V_TH0; //定时0.01s
TL0=V_TL0;
TH1=0xF3; //波特率2400
TL1=0xF3;
REN=1; //允许串口接收数据
SM0=0;//串口工作方式1,8位数据传送
SM1=1;
EA=1;//开总中断
ES=1; //串口中断开
PS=1; //串口中断优先级最高
ET0=1;//开定时器0中断
TR1=1; //开波特率
TR0=1;//启动定时器0
}
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |