电位器控制舵机

点击打开在线编译器,边学边练

1.题目要求

为了使ADC的知识能配合其他模块实现不同功能,这里我们打算通过扭动电位器(滑动变阻器)来控制舵机桨的位置,如果我们顺时针扭一圈电位器,那么舵机桨也会跟着从一端旋转到另一端。


2.main.c测试代码

#include <reg52.h>
#include <function.h>//详见第六章第8讲
#include <timer.h>   //详见第八章第11讲
#include <lcd.h>     //详见第十一章第3讲
#include <adc.h>     //详见第十四章
 
sbit PWMOUT=P1^7;    //舵机信号线接口
u8  flag20ms = 0;
u8  PWM_VAL  = 0;

void main()
{
    u8 val;
    u8 str[10];
    EA = 1;     
    InitLcd1602();      //初始化液晶屏
    TIM1_Init(20000,6); //定时20ms,6是微调使定时精度更高
    TIM0_Init(100,9);   //定时0.1ms,舵机专用,9是微调使定时精度更高
  
    LcdShowStr(6, 0, "AIN0");
    while (1)
    {
        if (flag20ms)                 //每隔20ms获取一次ADC通道0的转换值
        {
            flag20ms = 0;
            val = GetADCValue(0);     //获取ADC通道0的转换值   
            ValueToString(str, val);  //转为字符串格式的电压值
            LcdShowStr(6, 1, str);    //显示通道0的电压    
            PWM_VAL=val/14+5;         //此时PWM_VAL的取值范围是5~23
        }
    }
}
  
void TIM0_IRQHandler() interrupt 1
{ 
    static u8 pwm=0;
    TH0 = T0RH;              //重新加载重载值
    TL0 = T0RL;
  
    pwm++;
    if(pwm>=200)pwm=0;       //pwm在0~199之间间隔0.1ms变化,周期为20ms
  
    if(pwm<PWM_VAL)PWMOUT=1; //PWM_VAL的值决定舵机桨的停留位置
    else PWMOUT=0;
}
 
void TIM1_IRQHandler() interrupt 3
{  
    TH1 = T1RH;              //重新加载重载值
    TL1 = T1RL;
  
    flag20ms = 1;
}

我们把上一章测试AD,DA所拔下的跳线帽插回去先。开发板底部中间处有一个电位器,大家用一字螺丝刀来旋转电位器就可以观察到舵机桨跟着旋转了。此外舵机的电源供电最好使用外部电源,用开发板来给舵机供电会导致液晶屏失压闪烁,而且舵机的稳定性也不是很好,笔者测试的时候是使用另外的5V电源电压给舵机供电,连接图如下

15.10.png


本文固定URL:https://www.dotcpp.com/course/421

下一课:遥控器控制舵机
第一章 单片机入门
第二章 LED
第三章 蜂鸣器
第四章 数码管
第五章 独立按键
第六章 多文件编程
第七章 外部中断
第八章 定时器
第九章 舵机与超声波模块
第十章 串口通信
第十一章 1602液晶屏
第十二章 IIC通信
第十三章 红外遥控与温度传感器
第十四章 AD与DA
第十五章 混合例程
第十六章 完结
Dotcpp在线编译      (登录可减少运行等待时间)