⑴ 为什么运行舵机就会导致单片机复位
有可能舵机需要的瞬时驱动电流超过了电池能提供的最大电流,导致供电电压下降,引起单片机复位,这个可以用示波器观察舵机启停时供电电压的波形来发现。如果是这样,需要一定的计算,看是否需要调整更换更高容量的电池,或者在舵机驱动电源部分增加相当的储电电容。
⑵ 这个单片机控制舵机的程序 舵机会抖动 哪位大侠帮我改一下c程序
试试这个吧,我用过的
#include<hidef.h>
//#include <math.h>
// #include <mc9s12xs128.h>
#include "derivative.h"
//#pragma LINK_INFO DERIVATIVE"mc9s12dg128b"
/*****定义变量******/
unsigned int a,c,d;
unsigned int AD_wValue,B; //AD转换结果
int b,i,x,e,j;
void LEDShow(int x);
/*****总线初始化*****/
void PLL_Init(void) {
REFDV=1;
SYNR=2;
while(!(CRGFLG&0x08));
CLKSEL=0x08;
}
/******AD初始化******/
/*void AD_Init() {
//ATD0CTL1=0x00;
ATD0CTL2=0xC0;//启动AD,快速清零,无等待模式,禁止外部触发,中断禁止
ATD0CTL3=0x40;//转换序列长度8
ATD0CTL4=0x85;
ATD0CTL5=0xA0;//右对齐无符号,单通道0采样
ATD0DIEN=0x00;//禁止数字量输入 */
/**读取AD转换结果**/
/*void AD_GetValue()
{
while(!ATD0STAT0_SCF); //等待转换结束
AD_wValue=ATD0DR0L;//读取结果寄存器的值
} */
/*****pwm初始化********/
void PWM_Init(void)
{
PWME_PWME1=0x00; // Disable PWM (PP1) 禁止
PWMCTL_CON01=1; //0,1级联,寄存器为通道1的
PWMCAE_CAE1=0; //通道7左对齐
PWMCNT01=0; // 计时器清零
PWMPOL_PPOL1=1; // 先置高电平,DYT反
PWMPRCLK=0; //COLCKA不分频
PWMSCLA=4; //COLCK SA进行16分频
PWMDTY01=1500; // 舵机静止占空比为7.5%=1500/20000
PWMPER01=20000; //周期20MS
PWMCLK_PCLK1=1; // CLOCK SA 作时钟源
PWME_PWME1=1;
}
/*舵机控制*/
void PWMDuo_Dutycycle(int d)
{
PWMDTY01=d;
PWME_PWME1=1; // Enable PWM 使能
}
void delay(long m){
while(m--);
}
/**************显示输出*******************/
const int Dtable[10] =
{0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
const int CStable[4] =
{0xF7,0xFB,0xFD,0xFE};
void LEDShow1(int i,int c)
{
PTT&= CStable[i];
PORTB = Dtable[c];
delay(100);
PTT|=0xff;
}
void LEDShow(int x){
DDRB=0xFF;
DDRT=0xFF;
b = x/10; //x=126 b=12
e=x-b*10; // e=6
x=b; // x=12
for(i=0;i<=3;i++) {
LEDShow1(i,e);
b = x/10; //b=1 //b=0 b=0
e=x-b*10; // e=2 e=1 e=0
x=b; // x=1 x=0 x=0
}
}
/******主函数*********/
void main(void) {
/*put your own code here*/
//EnableInterrupts;
DisableInterrupts;
PLL_Init();
ATD0CTL1=0x00;
ATD0CTL2=0xC0;//启动AD,快速清零,无等待模式,禁止外部触发,中断禁止
ATD0CTL3=0x80;//转换序列长度8
ATD0CTL4=0x83;
ATD0CTL5=0xA0;//右对齐无符号,单通道0采样
ATD0DIEN=0x00;//禁止数字量输入
PWM_Init();
for(;;)
{
while(!ATD0STAT0_SCF); //等待转换结束
AD_wValue=ATD0DR0;//读取结果寄存器的值
B=AD_wValue;
a=1150+(1000/250)*B;
if ( a>2000 )
{
a=2000;
}
else if(a<1000)
{
a=1000;
}
else{
a=a;
}
PWMDuo_Dutycycle(a) ;
LEDShow(a) ;
// _FEED_COP(); /* feeds the dog */
}/* loop forever */
/* please make sure that you never leave main */
}
⑶ 用单片机控制舵机,为什么一上电就转到尽头,然后怎么控制也不转,问题出在哪里
你好!
舵机最好不用开发板上的电源,会产生干扰信号。你试试给舵机单独供电。另外单片机和舵机要共地。
如果你运行程序时,舵机总是在小范围内抖动,很可能就是共用一个电源
干扰引起的。
如果对你有帮助,望采纳。
⑷ 为什么我用单片机控制的舵机总是抖动
舵机供电确认和单片机分开,另外看你单片机给出的信号有没有问题,其次舵机本身是不是存在问题,欧兹舵机为您解答。
⑸ 51单片机控制9g小舵机,转90度后再复位。求程序。
给你个思路
0-90度
1、IO输出高电平1.5ms
2、低电平输出18.5ms(周期20ms)
3、循环重复100次步骤1 2
90-0度
1、IO输出高电平0.5ms
2、低电平输出19.5ms(周期20ms)
3、循环重复100次步骤1 2
⑹ 51单片机如何控制舵机控制板复位
有复位开发吧,用单片机控制这个开关的开启和闭合就可以实现了。
⑺ 求一段简单的51单片机的程序,通电后舵机顺时针旋转180度,2秒后恢复。
51单片机控制舵机程序
#include <reg52.h>
#define Stop 0 //宏定义,停止
#define Left 1 //宏定义,左转
#define Right 2 //宏定义,右转
sbit ControlPort = P2^0; //舵机信号端口
sbit KeyLeft = P1^0; //左转按键端口
sbit KeyRight = P1^1; //右转按键端口
sbit KeyStop = P1^2; //归位按键端口
unsigned char TimeOutCounter = 0,LeftOrRight = 0; //TimeOutCounter:定时器溢出计数 LeftOrRight:舵机左右旋转标志
void InitialTimer ( void )
{
TMOD=0x10; //定时/计数器1工作于方式1
TH1 = ( 65535 - 500 ) / 256; //0.25ms
TL1 = ( 65535 - 500 ) % 256;
EA=1; //开总中断
ET1=1; //允许定时/计数器1 中断
TR1=1; //启动定时/计数器1 中断
}
void ControlLeftOrRight ( void ) //控制舵机函数
{
if( KeyStop == 0 )
{
//while ( !KeyStop ); //使标志等于Stop(0),在中断函数中将用到 LeftOrRight = Stop;
}
if( KeyLeft == 0 )
{
//while ( !KeyLeft ); //使标志等于Left(1),在中断函数中将用到 LeftOrRight = Left;
}
if( KeyRight == 0 )
{
//while ( !KeyRight ); //使标志等于Right(2),在中断函数中将用到 LeftOrRight = Right;
}
⑻ 机器人用的是stc5410单片机控制的舵机,启动的时候手臂的舵机会抖动,动作过大机器人还会自动复位····
舵机的供电最好由单片机来控制,而不仅仅是由单片机来控制舵机的动作,换句话说,一定要等单片机初始化完成后,舵机的控制信号到位后,才能给舵机供电,不然的话,舵机上电后动作不确定。
一句话,先给控制部分供电,再给执行部分供电。
⑼ 请问用51单片机控制舵机时,把单片机的VCC和GND当做舵机的电源电压,为什么舵机工作不了,一抖一抖的
显然是你的电源容量不够,舵机工作时电压下降,不工作电压上升。
要根本解决办法是加大电源容量,还有在5V电源上并一个大的电容,但这个不是根本的办法。