用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();
}