一种具有12路PWM直流电机的串口遥控机器人

技术领域
本实用新型涉及一种一种具有12路PWM直流电机的串口遥控机器人,尤其是一种可以用串口无线WIFI遥控的智能机器人。
背景技术
现有常规遥控机人按照无线电信号的遥控进行动作,也可以按照存储在寄存器里面的程序动作,但是动作电机较少,一般只有4路PWM直流电机,这对机器人的行动带来很大的不便。一种具有12路PWM直流电机的串口遥控机器人是一种具有12路PWM直流电机的机器人,操作者可以使用计算机串口WIFI信号对它的12路直流电机进行遥控,它也可以按照其控制电路中的24C04铁电存储器里面的数据,在STC11F60单片机的控制下进行动作。
实用新型内容
为了解决常规遥控机器人动作电机较少的缺点,一种具有12路PWM直流电机的串口遥控机器人提供了一种具有12路PWM直流电机进行串口WIFI信号遥控动作的机器人。它可以按照电路中的24C04铁电存储器里面的数据,在STC11F60单片机的控制下进行动作,也可以按照操作人员计算机串口WIFI信号的遥控进行动作。由于它具有12路PWM直流电机,所以它可以进行行走,抬手,伸手等多种动作。
本实用新型解决其技术问题所采用的技术方案是:一种具有12路PWM直流电机的串口遥控机器人是一种可以被WIFI串口信号遥控的机器人。它依靠外壳下面装配的12路PWN直流电机在操作人员的计算机串口WIFI信号的遥控下进行的转动进行各种动作,它可以在电机的转动下进行移动,行走,抬手等等动作。同时,它也可以按照控制电路中的24C04铁电存储器里面的数据,在STC11F60单片机(1)的控制下进行电机的转动等动作。它的控制电路如图1所示。在图1中,STC11F60单片机(1)的P1中的P1.0, P1.1, P1.2, P1.3, P1.4, P1.5, P1.6,P1.7端口,P3 中的P3.2, P3.5, P3.6, P3.7端口在定时器TIME0产生12路PWM方波,上面总共12路IO口,每个IO口产生一路PWM信号,总共12路PWM控制方波信号。WIFI模块(2)连接在单片机STC11F60(1)的串口上面,它接收操作人员发出的数据,然后单片机STC11F60 (1)按照程序减少或增加PWM方波的占空比。同时单片机(1)按照铁电存储器24C04(3)中的数据控制上面的PWM方波信号。微云文件分享:12PWM机器人下载地址:

https://share.weiyun.com/51DCGVd

单片机STC11F60的控制程序是在keill4编译环境下,通过C语言编译并通过串口下载到单片机STC11F60。程序代码如下:
/******************************************************************************
*程序思路说明: *
* *
*关于频率和占空比的确定,对于12M晶振,假定PWM输出频率为1KHZ,这样定时中断次数 *
*设定为C=10,即0.01MS中断一次,则TH0=FF,TL0=F6;由于设定中断时间为0.01ms,这样可以设定占空比
可从1-100变化。即0.01ms*100=1ms *
******************************************************************************/
#include <regx51.h>
#include <INTRINS.H>
#define uchar unsigned char
#include <intrins.h>
#define OP_READ 0xa1 // 器件地址以及读取操作
#define OP_WRITE 0xa0 // 器件地址以及写入操作
#define MAX_ADDR 0x7f // AT24C02最大地址
/*****************************************************************************
* TH0和TL0是计数器0的高8位和低8位计数器,计算办法:TL0=(65536-C)%256; *
* TH0=(65536-C)/256,其中C为所要计数的次数即多长时间产生一次中断;TMOD是计数器*

* 工作模式选择,0X01表示选用模式1,它有16位计数器,最大计数脉冲为65536,最长时 *
* 间为1ms*65536=65.536ms *
******************************************************************************/
#define V_TH0 0XFF
#define V_TL0 0XF6
#define V_TMOD 0X01
#define V_TH1 0XFF
#define V_TL1 0XF6
#define V_TH2 0XFF
#define V_TL2 0XF6
unsigned char code dis_code[] = {0x7e,0xbd,0xdb,0xe7,0xdb,0xbd,0x7e,0xff};
// 写入到AT24C01的数据串
sbit SDA = P3^4;
sbit SCL = P3^3;
void start();
void stop();
unsigned char shin();
bit shout(unsigned char write_data);
unsigned char read_random(unsigned char random_addr);
void write_byte( unsigned char addr, unsigned char write_data);
void fill_byte(unsigned char fill_data);
void delayms(unsigned char ms);
void init_sys(void); /*系统初始化函数*/
void Delay5Ms(void);
unsigned char ZKB1,ZKB2,ZKB3,ZKB4,ZKB5,ZKB6,ZKB7,ZKB8,ZKB9,ZKB10,ZKB11,ZKB12,ZKB13,ZKB14,ZKB15,ZKB16,ZKB17,ZKB18;
unsigned char ZKB19,ZKB20,ZKB21,ZKB22,ZKB23,ZKB24,ZKB25,ZKB26,ZKB27,ZKB28,ZKB29,ZKB30,ZKB31,ZKB32;

unsigned char key_s, key_v, tmp,tmp1;
char code str[]={0x7e,0xbd,0xdb,0xe7,0xdb,0xbd,0x7e,0xff,0x7e,0xbd,0xdb,0xe7,0xdb,0xbd,0x7e,0xff,0x7e,0xbd,0xdb,0xe7,0xdb,0xbd,0x7e,0xff};
void send_str();
bit scan_key();
void proc_key();
void delayms(unsigned char ms);
void send_char(unsigned char txd);
unsigned char i;
unsigned char p;
unsigned char p1=0x00,p2,p3,p4;
void main (void)
{
init_sys();
ZKB1=40; /*占空比初始值设定*/
ZKB2=70; /*占空比初始值设定*/
ZKB3=20; /*占空比初始值设定*/
ZKB4=70; /*占空比初始值设定*/
ZKB5=30; /*占空比初始值设定*/
ZKB6=70; /*占空比初始值设定*/
ZKB7=80; /*占空比初始值设定*/
ZKB8=70; /*占空比初始值设定*/
ZKB9=50; /*占空比初始值设定*/
ZKB10=70; /*占空比初始值设定*/
ZKB11=40; /*占空比初始值设定*/
ZKB12=40; /*占空比初始值设定*/

ZKB13=40; /*占空比初始值设定*/
ZKB14=70; /*占空比初始值设定*/
ZKB15=60; /*占空比初始值设定*/
ZKB16=70; /*占空比初始值设定*/
ZKB17=40; /*占空比初始值设定*/
ZKB18=70; /*占空比初始值设定*/
ZKB19=20; /*占空比初始值设定*/
ZKB20=70; /*占空比初始值设定*/
ZKB21=30; /*占空比初始值设定*/
ZKB22=70; /*占空比初始值设定*/
ZKB23=80; /*占空比初始值设定*/
ZKB24=70; /*占空比初始值设定*/
ZKB25=50; /*占空比初始值设定*/
ZKB26=70; /*占空比初始值设定*/
ZKB27=40; /*占空比初始值设定*/
ZKB28=40; /*占空比初始值设定*/
ZKB29=40; /*占空比初始值设定*/
ZKB30=70; /*占空比初始值设定*/
ZKB31=60; /*占空比初始值设定*/
ZKB32=70; /*占空比初始值设定*/
SDA = 1;
SCL = 1;
// fill_byte(0x00); // 全部填充0xff
while(1)
{
if(RI) // 是否有数据到来
{
RI = 0;
tmp = SBUF; // 暂存接收到的数据
// tmp1=SBUF++;
// dis_code[i]=SBUF;
// 数据传送到P0口
// str[1]=SBUF;
write_byte(0X00, tmp);
// write_byte(0X00, str[1]);
// write_byte(0X01, tmp1);
P0 = read_random(0X00); // 循环读取24Cxx内容,并输出到P0口
// P2= read_random(0X01);
p1= read_random(0X00);
// p2= read_random(0X01);
//delayms(250);

send_char(tmp); // 回传接收到的数据
// send_str() ;
}
tmp1 = str[i];
write_byte(0X01, tmp1);
i++; // 下一个字符
P2 = read_random(0X01); // 循环读取24Cxx内容,并输出到P0口
if (!P0_0) //如果按了+键,增加占空比
{
Delay5Ms();
if (!P0_0)
{
ZKB1--;
// ZKB1=90;
}
}
if (!P0_1) //如果按了+键,增加占空比
{
Delay5Ms();
if (!P0_1)
{
ZKB1++;
// ZKB1=20;
}
}
if (!P0_2) //如果按了+键,增加占空比
{
Delay5Ms();
if (!P0_2)

{
ZKB2--;
// ZKB1=90;
}
}
if (!P0_3) //如果按了+键,增加占空比
{
Delay5Ms();
if (!P0_3)
{
ZKB2++;
// ZKB1=20;
}
}
if (!P0_4) //如果按了+键,增加占空比
{
Delay5Ms();
if (!P0_4)
{
ZKB3--;
// ZKB1=90;
}
}
if (!P0_5) //如果按了+键,增加占空比
{
Delay5Ms();
if (!P0_5)
{
ZKB3++;
// ZKB1=20;
}
}
if (!P0_6) //如果按了+键,增加占空比
{
Delay5Ms();
if (!P0_6)
{
ZKB4--;
// ZKB1=90;
}
}
if (!P0_7) //如果按了+键,增加占空比
{
Delay5Ms();
if (!P0_7)
{
ZKB4++;
// ZKB1=20;
}
}
if (!P2_0) //如果按了+键,增加占空比
{
Delay5Ms();
if (!P2_0)
{
ZKB5--;
// ZKB1=90;
}
}
if (!P2_1) //如果按了+键,增加占空比
{
Delay5Ms();
if (!P2_1)
{
ZKB5++;
// ZKB1=20;
}
}
// if (!SBUF) //如果按了-键,减少占空比
// {
// Delay5Ms();
// if (SBUF=0x02)
// {
// ZKB1--;
// }
// }
/*对占空比值限定范围*/
//if (ZKB1>99) ZKB1=1;
//if (ZKB1<1) ZKB1=99;
}
}
/******************************************************
*函数功能:对系统进行初始化,包括定时器初始化和变量初始化*/
void init_sys(void) /*系统初始化函数*/
{
/*定时器TIME0初始化*/
//TMOD=V_TMOD;
TH0=V_TH0;
TL0=V_TL0;
TR0=1;
ET0=1;
EA=1;
/*定时器TIME1初始化*/
TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率
TH1 = 0xFD; // 波特率9600
TL1 = 0xFD;
SCON = 0x50; // 设定串行口工作方式
PCON &= 0xef; // 波特率不倍增
TR1 = 1; // 启动定时器1
// IE = 0x0; // 禁止任何中断
// TH2=V_TH2;
// TL2=V_TL2;
// TR2=1;
// ET2=1;
//EA=1;
}
//延时
void Delay5Ms(void)
{
unsigned int TempCyc = 1000;
while(TempCyc--);
}
/*中断函数*/

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_0=0;
else
P1_0=1;
if (click<=ZKB2)
P1_1=0;
else
P1_1=1;
if (click<=ZKB3) /*当小于占空比值时输出低电平,高于时是高电平,从而实现占空比的调整*/
P1_2=0;
else
P1_2=1;
if (click<=ZKB4)
P1_3=0;
else
P1_3=1;
if (click<=ZKB5) /*当小于占空比值时输出低电平,高于时是高电平,从而实现占空比的调整*/
P1_4=0;
else
P1_4=1;
if (click<=ZKB6)
P1_5=0;
else
P1_5=1;
if (click<=ZKB7) /*当小于占空比值时输出低电平,高于时是高电平,从而实
现占空比的调整*/
P1_6=0;
else
P1_6=1;
if (click<=ZKB8)
P1_7=0;
else
P1_7=1;
// if (click<=ZKB9) /*当小于占空比值时输出低电平,高于时是高电平,从而实现占空比的调整*/
//P2_0=0;
//else
// P2_0=1;
//if (click<=ZKB10)
//P2_1=0;
//else
//P2_1=1;
//if (click<=ZKB11) /*当小于占空比值时输出低电平,高于时是高电平,从而实现占空比的调整*/
// P2_2=0;
//else
// P2_2=1;
//if (click<=ZKB12)
//P2_3=0;
//else
//P2_3=1;
// if (click<=ZKB13) /*当小于占空比值时输出低电平,高于时是高电平,从而实现占空比的调整*/
//P2_4=0;
//else
// P2_4=1;
//if (click<=ZKB14)
// P2_5=0;
//else
//P2_5=1;
//if (click<=ZKB15) /*当小于占空比值时输出低电平,高于时是高电平,从而实现占空比的调整*/
// P2_6=0;
//else
//P2_6=1;
//if (click<=ZKB16)
//P2_7=0;
//else
// P2_7=1;
//if (click<=ZKB17) /*当小于占空比值时输出低电平,高于时是高电平,从而实现占空比的调整*/
// P3_0=0;
//else
//P3_0=1;
//if (click<=ZKB18)
// P3_1=0;
//else
//P3_1=1;
if (click<=ZKB19) /*当小于占空比值时输出低电平,高于时是高电平,从而实现占空
比的调整*/
P3_2=0;
else
P3_2=1;
//if (click<=ZKB20)
//P3_3=0;
//else
//P3_3=1;
// if (click<=ZKB21) /*当小于占空比值时输出低电平,高于时是高电平,从而实现占空比的调整*/
// P3_4=0;
//else
// P3_4=1;
if (click<=ZKB22)
P3_5=0;
else

P3_5=1;
if (click<=ZKB23) /*当小于占空比值时输出低电平,高于时是高电平,从而实现占空比的调整*/
P3_6=0;
else
P3_6=1;
if (click<=ZKB24)
P3_7=0;
else
P3_7=1;
}
void send_char(unsigned char txd)
// 传送一个字符
{
SBUF = txd;
while(!TI); // 等特数据传送
TI = 0; // 清除数据传送标志
}
void send_str()
// 传送字串
{
unsigned char i = 0;
while(str[i] != ‘\0‘)
{
SBUF = str[i];
while(!TI); // 等特数据传送
TI = 0; // 清除数据传送标志
i++; // 下一个字符
}
}
void start()
// 开始位
{
SDA = 1;

SCL = 1;
_nop_();
_nop_();
SDA = 0;
_nop_();
_nop_();
_nop_();
_nop_();
SCL = 0;
}
void stop()
// 停止位
{
SDA = 0;
_nop_();
_nop_();
SCL = 1;
_nop_();
_nop_();
_nop_();
_nop_();
SDA = 1;
}
unsigned char shin()
// 从AT24Cxx移入数据到MCU
{
unsigned char i,read_data;
for(i = 0; i < 8; i++)
{
SCL = 1;
read_data <<= 1;
read_data |= (unsigned char)SDA;
SCL = 0;
}
return(read_data);
}
bit shout(unsigned char write_data)
// 从MCU移出数据到AT24Cxx
{
unsigned char i;
bit ack_bit;
for(i = 0; i < 8; i++) // 循环移入8个位
{
SDA = (bit)(write_data & 0x80);
_nop_();
SCL = 1;
_nop_();
_nop_();
SCL = 0;
write_data <<= 1;
}
SDA = 1; // 读取应答
_nop_();
_nop_();
SCL = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ack_bit = SDA;
SCL = 0;
return ack_bit; // 返回AT24Cxx应答位
}
void write_byte(unsigned char addr, unsigned char write_data)
// 在指定地址addr处写入数据write_data
{
start();
shout(OP_WRITE);
shout(addr);
shout(write_data);
stop();
delayms(10); // 写入周期
}
void fill_byte(unsigned char fill_data)
// 填充数据fill_data到EEPROM内
{
unsigned char i;
for(i = 0; i < MAX_ADDR; i++)
{
write_byte(i, fill_data);
}
}
unsigned char read_current()
// 在当前地址读取
{
unsigned char read_data;
start();
shout(OP_READ);
read_data = shin();
stop();
return read_data;
}

unsigned char read_random(unsigned char random_addr)
// 在指定地址读取
{
start();
shout(OP_WRITE);
shout(random_addr);
return(read_current());
}
void delayms(unsigned char ms)
// 延时子程序
{
unsigned char i;
while(ms--)
{
for(i = 0; i < 120; i++);
}
}
上述程序中,单片机STC11F60串口只能接收到一个字节的16进制数,所以每次必须发送一个字节的16进制数,这样单片机才能接收。程序中的下面内容:
if(RI) // 是否有数据到来
{
RI = 0;
tmp = SBUF; // 暂存接收到的数据
// tmp1=SBUF++;
// dis_code[i]=SBUF;
// 数据传送到P0口
// str[1]=SBUF;
write_byte(0X00, tmp);
// write_byte(0X00, str[1]);
// write_byte(0X01, tmp1);
P0 = read_random(0X00); // 循环读取24Cxx内容,并输出到P0口
// P2= read_random(0X01);
p1= read_random(0X00);
// p2= read_random(0X01);
//delayms(250);
send_char(tmp); // 回传接收到的数据
// send_str() ;
}

这段代码实现的内容是将串口接收的一个字节数据存储到24C04中的0X00寄存器中,并输出到单片机的P0端口,并赋值给p1,最后有将接收到的数据从串口发送出去。
tmp1 = str[i];
write_byte(0X01, tmp1);
i++; // 下一个字符
P2 = read_random(0X01); // 循环读取24Cxx内容,并输出到P0口
这段代码实现的功能是将str[i]数组赋值给tmp1,并写入到24C04的0X01寄存器中,并输出到单片机的P2端口。
if (!P0_0) //如果按了+键,增加占空比
{
Delay5Ms();
if (!P0_0)
{
ZKB1--;
// ZKB1=90;
}
}
if (!P0_1) //如果按了+键,增加占空比
{
Delay5Ms();
if (!P0_1)
{
ZKB1++;
// ZKB1=20;
}
}
这段代码实现的功能是将P1_0端口的PWM方波的占空比减小或增大。
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_0=0;
else
P1_0=1;
这段代码的功能是利用定时器TIME0产生PWM方波。
void init_sys(void) /*系统初始化函数*/
{
/*定时器TIME0初始化*/
//TMOD=V_TMOD;
TH0=V_TH0;
TL0=V_TL0;
TR0=1;
ET0=1;
EA=1;

/*定时器TIME1初始化*/
TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率
TH1 = 0xFD; // 波特率9600
TL1 = 0xFD;
SCON = 0x50; // 设定串行口工作方式
PCON &= 0xef; // 波特率不倍增
TR1 = 1; // 启动定时器1
// IE = 0x0; // 禁止任何中断
// TH2=V_TH2;
// TL2=V_TL2;
// TR2=1;
// ET2=1;
//EA=1;
}
这段代码的功能是利用初始化定时器TIME1,进行串口数据接收或发送。
上述的一种具有12路PWM直流电机的串口遥控机器人,所述的是一种具有12路PWM直流电机的串口WIFI遥控机器人。
附图说明
下面结合附图和实施例对本实用新型进一步说明。
图1为本实用电路图。
图1中,1.单片机STC11F60,2. WIFI模块,3.24C04存储器,4.12路PWM直流电机。
具体实施方式
图1中,单片机STC11F60(1)的P3.0,P3.1端口连接WIFI模块,单片机STC11F60(1)的P3.4,P3.4端口连接24C04存储器。STC11F60单片机(1)的P1中的P1.0, P1.1, P1.2, P1.3, P1.4, P1.5, P1.6,P1.7端口,P3 中的P3.2, P3.5, P3.6, P3.7端口,上面总共12路IO口,每个IO口连接一路直流电机。
图1中,单片机STC11F60(1)从串口接收或发送数据到WIFI模块(2),单片机STC11F60从24C04中读取或写入数据。STC11F60单片机(1)的P1中的P1.0, P1.1, P1.2, P1.3, P1.4, P1.5, P1.6, P1.7端口,P3 中的P3.2, P3.5, P3.6, P3.7端口,上面总共12路IO口,每个IO口产生一路PWM信号,并连接一路直流电机。

图1

原文地址:https://www.cnblogs.com/zgdcnyhl/p/12345035.html

时间: 2024-10-08 06:36:30

一种具有12路PWM直流电机的串口遥控机器人的相关文章

混杂设备驱动--输出两路PWM

尝试用2440的TOUT0和TOUT1输出PWM驱动两个电机,电机的硬件驱动电路是使用L298N. 先单独测试TOUT0的PWM输出: (1)驱动程序:使用misc混杂设备驱动模型,当然也可以使用基本的字符设备模型. 使用misc设备驱动模型步骤: ①初始化一个struct miscdevice结构体:主要是file_operation结构体成员和name ②使用misc_register和misc_deregister注册和注销这个结构体 代码示例: #include <linux/modul

nRF51822使用Timer制作4路PWM波详解

Date:2015.5.8 Author:杨正  QQ:1209758756 <[email protected]> 一.            pwm简介 PWM英文名叫Pulse Width Modulation,中文名叫脉宽调制.那它到底是什么呢?其实它是由定时器产生的,比普通的定时器多了一个比较寄存器.PWM里面有一个词叫占空比,即一个周期内,高电平持续时间与周期的比值.如下图: 占空比(dutycycle) = t/T. PWM用途:控制电机调速,控制蜂鸣器播放音乐,控制led灯亮度

Arduino控制16路PWM舵机驱动板(PCA9685)

最近买了块16路PWM舵机驱动板,测试后做个总结. 舵机原理网上资料很多就不详细介绍了,一般以9g舵机为例,一个20ms的周期内通过0.5ms到2.5ms的脉冲宽度控制舵机角度. 板子为16通道12bit PWM舵机驱动,用2个引脚通过I2C就可以驱动16个舵机. 修改例子为可以通过串口设置舵机角度 1 #include <Wire.h> 2 #include <Adafruit_PWMServoDriver.h> 3 4 //默认地址 0x40 5 Adafruit_PWMSer

多路RTSP流解码:最高可支持12路视频编解码

RK3399/RK3328具有强大的视频编解码能力,Soc集成的硬件视频编解码器VPU,能同时处理多路视频的编解码,Soc集成的图形加速引擎RGA, 可以高效地处理图形缩放.旋转.颜色空间转换等操作.结合VPU和RGA,可以高效地实现视频流的解码和后处理,作为第三方应用处理的数据源. 调用API Rockchip开发的mpp库,提供了非常易于使用API,通过各种不同的控制项,可以适应多种不同场景的视频编解码应用. 硬件准备 RK3399平台:AIO-3399C主板 + 12路摄像头 RK3328

控制AVR单片机5路PWM波形

现开发了单片机控制5路PWM波形,也可以同时控制15路直流三色灯板,按触摸屏顺序点亮的电路和程序,供大家参考. 电路为 单片机ATMEGA128控制5路PWM方波,按照74HC08逻辑编码输出15路PWM信号,一次按照迪文触摸屏点亮3种颜色灯板的5路发光信号.ULN2003提供12V电压.每个灯板通过一个CMOS管IR3205输出功率.一个74HC08通过一路PWM,这路PWM通过74HC08控制的继电器控制IR3205的开关,进而控制24V,13V,36V灯板的开关,灯板的亮度通过PWM波形的

nRF51822 的两路 PWM 极性

忙了一阵这个PWM,玩着玩着终于发现了些规律.Nordic 也挺会坑爹的. nRF51822 是没有硬件 PWM 的,只能靠一系列难以理解的 PPI /GPIOTE/TIMER来实现,其实我想说,我醉了. 幸好SDK有这个的demo,不然真的很醉.这里说的是SDK9.0.0. 即便是有SDK,相信很多人都像我一样,看下去会觉得晕头转向的,不过知道几个函数的应用就可以了. 先记下怎么开始用一个PWM.这里我要用2路极性相反的PWM. 先来初始化两个个PWM实例,名字是PWM1.PWM2,用硬件Ti

MSP430F149学习之路——PWM信号

代码一: 1 /******************************* 2 程序功能:ACLK=32768Hz 3 PWM波 T=512/32768 占空比75% 4 *********************************/ 5 6 #include <msp430x14x.h> 7 void main() 8 { 9 WDTCTL = WDTPW + WDTHOLD; 10 TACTL = TASSEL_1 + TACLR; 11 12 CCTL0 = 0X00; 13

51单片机PWM直流电机调速

直流电动机的PWM调压调速原理 直流电动机转速N的表达式为:N=U-IR/Kφ 由上式可得,直流电动机的转速控制方法可分为两类:调节励磁磁通的励磁控制方法和调节电枢电压的电枢控制方法.其中励磁控制方法在低速时受磁极饱和的限制,在高速时受换向火花和换向器结构强度的限制,并且励磁线圈电感较大,动态响应较差,所以这种控制方法用得很少.现在,大多数应用场合都使用电枢控制方法. 对电动机的驱动离不开半导体功率器件.在对直流电动机电枢电压的控制和驱动中,对半导体器件的使用上又可分为两种方式:线性放大驱动方式

二十三种设计模式[12] - 代理模式(Proxy Pattern)

前言 代理模式,属于对象结构型模式.在<设计模式 - 可复用的面向对象软件>一书中将之描述为" 为其它对象提供一种代理以控制对这个对象的访问 ". 在代理模式中,通常使用一个类来代表另一个类的功能,并由这个代理对象去控制原对象的引用. 结构 Subjuet(公共接口):代理类和被代理类的公共接口,保证任何使用目标的地方都可以被代理类替换: RealSubject(被代理类):代理类所代表的目标类: Proxy(代理类):包含对目标类的引用,目标类的封装: 场景 在日常生活中