表2 串行数据格式
D15~D12 D11~D18 D7~D0
? ? ? ?4位寄存器地址 8位控制命令或待显示数据
MAX7219的控制字寄存器
功 能
D15~D12
?地 址
D11 0 0 0 0 0 0 0 0 1 1 1 1 1 1
D10 0 0 0 0 1 1 1 1 0 0 0 0 1 1
D9 0 0 1 1 0 0 1 1 0 0 1 1 0 1
D8 0 1 0 1 0 1 0 1 0 1 0 1 0 1
16进制码
空操作 位0 位1 位2 位3 位4 位5 位6 位7 译码模式 显示亮度 扫表界限 停机 显示测试
?0 1 2 3 4 5 6 7 8 9 A B C F
??????????????????????? ?
?? 16
3.7系统电路总设计
本文直流调速采用定频调宽法:T1+T2保持一定(即保持周期固定),使T1在0~T范围内变化来改变a的值从而达到调控电压的目的。以89S51单片机系统和7812、7805稳压电源系统以及组L298功率放大驱动器构成直流电机占空比控制部分。由键盘key1和key2指令控制,单片机处理后发出矩形波,通过占空比的调节达到电机调速的目的。当按下key1按键时,占空比增大,电枢电压增大,电机转速增大;当按下key2按键时,占空比减小,电枢电压减小,电机转速减小。从而通过单片机达到简单调速的目的。
图11为系统的总电路设计图。
图11 总体电路原理图
4 直流调速系统程序设计 程序设计思想:
当按key1键时,电压升高,转速上升,当按key2键时,电压下降,转速下降;定时器1中断用来产生周期为1ms的脉宽信号,定时器每次中断后改变下一次的定时设置,设置值由按键决定,按key1,高脉宽定时时间加大,按key2,低脉宽定时时间增大,每次变化10us。
下图为电机调速(在附录详细介绍程序)、MAX7219控制子程序和PID数字控制流程图。
17
开始 初始化,周期T=20ms,高电平T0=10ms N 判断是否有按 键 按 下 Y T0增加或减少10us,改变占空比 图12 电机调速流程图
电机PWM调速和键盘扫描程序
main( ) {sbit speed; sbit speed1; display[3]=spead/1000; spead1=[spead/1000]; spead=spead1; display[2]=spead/100; spead=spead2; display[1]=spead/10; spead=spead3;
sbit P0^0=key1; //加速 sbit P0^1=key2; //减速 key() {
if(key1==1) //加速 {
while (key1==1); t++; } if(t>=5) t=5;
if(key2==1) //减速
18
开 始 定义变量 初 始 化 设置显示区首址 传送数据 显 示 返 回 13 MAX7219控制子程序流程图
图 }
{
while(key2==1); t--; } if(t<1) t=1;
}
for(i=0;i<4;i++)
{ Write_Max7219(i,1); delay(1000); } }
控制MAX7219子程序
#define DECODE_MODE 0x09 #define INTENSITY 0x0A #define SCAN_LIMIT 0x0B #define SHUT_DOWN 0x0C #define DISPLAY_TEST 0x0F //pin defined
/***********************************************************************/ //change this part at different board
sbit LOAD=P1^7; //MAX7219 Load-Data Input: rising edge pin 12 sbit DIN=P1^6; //MAX7219 Serial-Data Input: rising edge pin 1
sbit CLK=P1^5; //MAX7219 Serial-Clock Input: maximum 10MHz pin 13 //function define
void delay(unsigned int time) {
while(time--); }
/***********************************************************************/ void Write_Max7219_byte(unsigned char temp)//write max7219 a byte {
unsigned char i;
for (i=0;i<8;i++) { CLK=0; DIN=(bit)(temp&0x80); delay(200); temp<<=1; CLK=1; } }
19
始化kp,ki,kd, e(k-1)=0,e(k-2)=0 本次采样输入c(k),k 本次偏差e(k)=r(k)-c(k) 对e(k)判断分段 kp,ki,kd比例项u(p)=k(p)*[e(k)-c(k-1)] 积分项u(i)=k(i)* 微分项u(d)=k(d)*[e(k)-2e(k-1)+e(k-2)] 无刷电机 输出控制量为PWM u(k)=[u(p)+u(i)+u(d)]+u(k-1) e(k-2)=e(k-1),e(k-1)=e(k-2) u(k-1)=u(k) PWM 采样时间?定时中断 中 断 返 回 图14 PID数字控制流程图 PID计算部分
Main Program 主程序
/***********************************************************************/ double sensor (void) // Dummy Sensor Function { return 100; }
void actuator(double rDelta) // Dummy Actuator Function {}
void main(void) {
PID sPID; // PID Control Structure double rOut; // PID Response (Output) double rIn; // PID Feedback (Input) PIDInit ( &sPID ); // Initialize Structure
20