还是那句话,难者不会,会者不难。就只看你愿不愿意尝试,硬件的乐趣又何止于此。
硬件于我何加焉?
1.原理
真正了解一个东西和会用一个东西我一直认为那是两个境界。欲达登峰造极的地步,必须究其理那是必须的。
控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。
2.控制
舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms-2.5ms范围内的角度控制脉冲部分,总间隔为2ms。以180度角度伺服为例,那么对应的控制关系是这样的:
0.5ms————–0度;
1.0ms————45度;
1.5ms————90度;
2.0ms———–135度;
2.5ms———–180度;
注意:
舵机的输入线共有三条,如图6所示,红色中间,是电源线,一边黑色的是地线,这辆根线给舵机提供最基本的能源保证,主要是电机的转动消耗。电源有两种规格,一是4.8V,一是6.0V,分别对应不同的转矩标准,即输出力矩不同,6.0V对应的要大一些,具体看应用条件;另外一根线是控制信号线,Futaba的一般为白色,JR的一般为桔黄色。
本人所用舵机为红色VCC,橙色信号线,棕色GND
上一个51单片机定时器模拟PWM控制舵机的程序
PCA的各位下载吧。。。
源程序:
- #include <reg52.h>
- sbit PWMOUT = P1^0;
- unsigned char HighRH = 0; //高电平重载值的高字节
- unsigned char HighRL = 0; //高电平重载值的低字节
- unsigned char LowRH = 0; //低电平重载值的高字节
- unsigned char LowRL = 0; //低电平重载值的低字节
- void ConfigPWM(unsigned int fr, unsigned char dc);
- void ClosePWM();
- void main()
- {
- unsigned int i;
-
- EA = 1; //开总中断
-
- while (1)
- {
- ConfigPWM(50, 2);
- for (i=0; i<40000; i++);
- ClosePWM();
- ConfigPWM(50, 5);
- for (i=0; i<40000; i++);
- ClosePWM();
- ConfigPWM(50, 7);
- for (i=0; i<40000; i++);
- ClosePWM();
- ConfigPWM(50, 10);
- for (i=0; i<40000; i++);
- ClosePWM();
- ConfigPWM(50, 12);
- for (i=0; i<40000; i++);
- ClosePWM();
- ConfigPWM(50, 10);
- for (i=0; i<40000; i++);
- ClosePWM();
- ConfigPWM(50, 7);
- for (i=0; i<40000; i++);
- ClosePWM();
- ConfigPWM(50, 5);
- for (i=0; i<40000; i++);
- ClosePWM();
- }
- }
- /* 配置并启动PWM,fr-频率,dc-占空比 */
- void ConfigPWM(unsigned int fr, unsigned char dc)
- {
- unsigned int high, low;
- unsigned long tmp;
-
- tmp = (11059200/12) / fr; //计算一个周期所需的计数值
- high = (tmp*dc) / 100; //计算高电平所需的计数值
- low = tmp - high; //计算低电平所需的计数值
- high = 65536 - high + 12; //计算高电平的重载值并补偿中断延时
- low = 65536 - low + 12; //计算低电平的重载值并补偿中断延时
- HighRH = (unsigned char)(high>>8); //高电平重载值拆分为高低字节
- HighRL = (unsigned char)high;
- LowRH = (unsigned char)(low>>8); //低电平重载值拆分为高低字节
- LowRL = (unsigned char)low;
- TMOD &= 0xF0; //清零T0的控制位
- TMOD |= 0x01; //配置T0为模式1
- TH0 = HighRH; //加载T0重载值
- TL0 = HighRL;
- ET0 = 1; //使能T0中断
- TR0 = 1; //启动T0
- PWMOUT = 1; //输出高电平
- }
- /* 关闭PWM */
- void ClosePWM()
- {
- TR0 = 0; //停止定时器
- ET0 = 0; //禁止中断
- PWMOUT = 1; //输出高电平
- }
- /* T0中断服务函数,产生PWM输出 */
- void InterruptTimer0() interrupt 1
- {
- if (PWMOUT == 1) //当前输出为高电平时,装载低电平值并输出低电平
- {
- TH0 = LowRH;
- TL0 = LowRL;
- PWMOUT = 0;
- }
- else //当前输出为低电平时,装载高电平值并输出高电平
- {
- TH0 = HighRH;
- TL0 = HighRL;
- PWMOUT = 1;
- }
- }
复制代码
完整的代码工程请在2楼下载.
|