温孝强 2023-03-08 19:43 采纳率: 50%
浏览 73

用wifi模块发送信号让单片机控制舵机转动

用wifi模块发送信号让单片机控制舵机转动

单片机型号:stc15f104w

舵机型号:SG90 9g舵机 180度

WIFI模块:esp-01s(使用点灯科技连接小爱)

电路及操作流程:上电后使用小爱同学使esp-01s的io0为低电平,io0接单片机P3_2,下拉P3_2电平,程序判断P3_2==0,执行代码改变P3_3的电平输出pwm波,P3_3接舵机信号线使舵机转动

问题描述:

1.使用上述流程后,舵机不转动需手动转动舵机随意角度后再次呼小爱同学开关设备舵机转动一次后不动

2.使用上述流程后,舵机不转动需手动转动舵机随意角度后再次呼小爱同学开关设备舵机按预期正常转动两次,断电再次上电需要再次手动转动舵机

3.不接esp01s 使用跳线手动下拉P3_2电机 如果快速下拉两次舵机会小幅度转动然后会回到起始位置。如果将跳线一直接P3_2使其一直处于低电平状态,舵机不动。

4.在arduino miotPowerState()中改变io口电平后如果不加延时,舵机没有反应或转动一次。


        digitalWrite(D3,LOW);
        delay(150);

总结:舵机的转动极其不稳定,未找到问题所在。希望大家能帮忙看下问题出在哪儿?自我感觉问题在io0下拉P3_2过快或出现抖动?但是连接是直连的啊又不是按键的应该不会出现抖动问题吧,也不可能说是下拉太快单片机没检测到吧。另外在开发板上用按键正常速度按下一切正常运行,过快的话会转动不到位就会到起始点了,在单片机代码中if语句未执行完的情况下再次触发if条件会重新进入if体吗?

单片机代码如下:


# include <regx52.h>
 
unsigned char Count=0;    计数器
 
void Timer0Init(void)        //500微秒@11.0592MHz
{
    TMOD &= 0xF0;        //设置定时器模式
    TL0 = 0x33;        //设置定时初值
    TH0 = 0xFE;        //设置定时初值
    TF0 = 0;        //清除TF0标志
    TR0 = 0;        //定时器0不计时
    ET0 = 1;
    EA  = 1;
}
 
void main()
{
    P3_3=0;
    Timer0Init();    
    while(1)
    {
        if(P3_2==0)
        {
            P3_3=1;                //P3_3是PWM
            TR0=1;                开始计时
            while(Count>=1)        //高电平为0.5ms
                P3_3=0;
            if(Count>=40)           //低电平为19.5ms
                Count=0;            //计数器清零
            TR0=0;                   //停止计时
            P3_3=1;
            TR0=1;                    //开始计时
            while(Count>=2)            //高电平1ms
                P3_3=0;
            if(Count>=40)             //低电平19ms
                Count=0;              //计数器清零
            TR0=0;                   //停止计时  
        }
    }
}
 
void Timer0_Rountine(void)        interrupt 1        //使Count每500us+1
{
    TR0=0;
    Count++;        
    TR0=1;
}

arduino代码如下:

 
#define BLINKER_WIFI
#define BLINKER_MIOT_LIGHT
 
#include <Blinker.h>
 
static const uint8_t D3   = 0;
 
char auth[] = "7ee845cegc47";
char ssid[] = "123";
char pswd[] = "1234567890";
 
// 新建组件对象
BlinkerButton Button1("btn-abc");
BlinkerNumber Number1("num-abc");
 
int counter = 0;
 
 
void miotPowerState(const String & state)
{
    BLINKER_LOG("need set power state: ", state);
 
    if (state == BLINKER_CMD_ON) {
        digitalWrite(D3,LOW);
        delay(150);
        BlinkerMIOT.powerState("on");
        BlinkerMIOT.print();
        digitalWrite(D3,HIGH);
    }
    else if (state == BLINKER_CMD_OFF) {
        digitalWrite(D3, LOW);
        //delay(100);
        BlinkerMIOT.powerState("off");
        BlinkerMIOT.print();
        digitalWrite(D3, HIGH);
    }
}
 
void setup()
{
    // 初始化串口
    Serial.begin(115200);
    BLINKER_DEBUG.stream(Serial);
    BLINKER_DEBUG.debugAll();
    
    // 初始化有LED的IO
    pinMode(D3, OUTPUT);
    digitalWrite(D3, HIGH);
    // 初始化blinker
    Blinker.begin(auth, ssid, pswd);
 
     BlinkerMIOT.attachPowerState(miotPowerState);
}
 
 
void loop() {
    Blinker.run();
}

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-03-09 05:27
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 3月8日

悬赏问题

  • ¥15 R语言中lasso回归报错
  • ¥15 网站突然不能访问了,上午还好好的
  • ¥15 semrush,SEO,内嵌网站,api
  • ¥15 Stata:为什么reghdfe后的因变量没有被发现识别啊
  • ¥15 关于#c语言#的问题,请各位专家解答!
  • ¥15 这个如何解决详细步骤
  • ¥15 在微信h5支付申请中,别人给钱就能用我的软件,这个的所属行业是啥?
  • ¥30 靶向捕获探针设计软件包
  • ¥15 别人给钱就能用我的软件,这个的经营场景是啥?
  • ¥15 react-diff-viewer组件,如何解决数据量过大卡顿问题