STC单片机关于舵机pwm控制源程序(单个与多个速度控制都有)

2020-02-27来源: 51hei关键字:STC单片机  舵机  pwm控制

单片机源程序如下:

/*****************************************************************************

** 文件: main.c

** 作者: Zheng23

** 日期:                         

** 功能:产生8路PWM输出控制8路舵机,方法:将20毫秒分成8个2500微秒,

即8个单元,先计算出第一个单元的舵机PWM控制线的脉冲宽度,因

为控制舵机的脉冲宽度最大为2500微秒,剩余的(20000 - 2500)

毫秒就是剩下的7个单元时间,第一个单元的舵机PWM控制线全部为

低电平了,这时就可以安心的处理剩下的7个单元的事情了,同理

第二个单元也是一样,这样循环下去就可以控制8路PWM输出了。

/*****************************************************************************/

//#include

//#include"STC89C5xRC.H"


//一定要用12M的晶振

//一定要用12M的晶振

//一定要用12M的晶振

//一定要用12M的晶振

//一定要用12M的晶振

//一定要用12M的晶振


#include "reg51.h"


#define bool        bit

#define uint8        unsigned char    

#define uint16        unsigned short int

#define uint32        unsigned long 


sbit SERVO0=P0^0;                        //控制舵机的PWM输出口

sbit SERVO1=P0^1;                        

sbit SERVO2=P0^2;                

sbit SERVO3=P0^3;

sbit SERVO4=P0^4;                

sbit SERVO5=P0^5;                

sbit SERVO6=P0^6;                        

sbit SERVO7=P0^7;


sbit LED=P2^7;                //调试用


uint16 ServoPwmDuty[8] = {1500,1500,1500,1500,1500,1500,1500,1500};        //PWM脉冲宽度

uint16 ServoPwmDutySet[8] = {1500,1500,1500,1500,1500,1500,1500,1500};        //PWM脉冲宽度

double ServoPwmDutyInc[8];                //为了速度控制,当PWM脉宽发生变化时,每2.5ms或20ms递增的PWM脉宽


bool Flag_20ms = 0;                //20毫秒标识位,在定时中断里面置位

bool Flag_2_5ms = 0;        //2.5毫秒标识位,在定时中断里面置位

bool ServoPwmDutyHaveChange = 0;        //脉宽有变化标志位

uint16 ServoTime = 2000;                        //舵机从当前角度运动到指定角度的时间,也就是控制速度

/***********************************************************

* 名    称: DelayMs(uint16 ms) 

* 功    能: 延时ms毫秒

* 入口参数: ms        毫秒

* 出口参数: 无

* 说    明:                                          

/**********************************************************/

void DelayMs(uint16 ms)

{

        uint16 i,j;

        for(i=0;i<800;i++)                //89单片机用85,12系列单片机用800

                for(j=0;j

}


/***********************************************************

* 名    称:InitTimer0()

* 功    能:时钟0初始化

* 入口参数:无

* 出口参数:无

* 说    明:12M晶振,12分频,所以计数器每递增一个数就是1微秒,完全满足舵机控制的精度要求

                        因为定时器是TH0,TL0都要全部计数到0xFF后在计1个数就会产生中断,所以要想产生

                        x毫秒的中断,那么TH0,TL0就应该赋值(0xFFFF-x)        从这个值开始计数产生定时中断                                         

/**********************************************************/ 

void InitTimer0(void)

{

//        AUXR &= 0x7F;                //定时器时钟12T模式

//        AUXR |= 0x00;                //T0,T1工作在12T

        TMOD &= 0xF0;                //设置定时器模式

        TMOD |= 0x01;                //设置定时器模式

        TL0 = 0x00;                        //设置定时初值

        TH0 = 0x00;                        //设置定时初值

        TF0 = 0;                        //清除TF0标志

        TR0 = 1;                        //定时器0开始计时

        ET0 = 1;                        //开定时器0中断

}


/***********************************************************

* 名    称:Timer0Value(uint16 pwm)  

* 功    能:给定时器0计数器赋值产生定时中断 

* 入口参数:pwm                控制舵机的PWM脉冲宽度值(范围:500~2500)

* 出口参数:无

* 说    明:12M晶振,12分频,所以计数器每递增一个数就是1微秒,完全满足舵机控制的精度要求

                        因为定时器是TH0,TL0都要全部计数到0xFF后在计1个数就会产生中断,所以要想产生

                        pwm毫秒的中断,那么TH0,TL0就应该赋值(0xFFFF-pwm)        从这个值开始计数产生定时中断                                          

/**********************************************************/ 

void Timer0Value(uint16 pwm)

{

        uint16 value;

        value=0xffff-pwm;                

        TR0 = 0;

        TL0=value;                        //16位数据给8位数据赋值默认将16位数据的低八位直接赋给八位数据

    TH0=value>>8;                //将16位数据右移8位,也就是将高8位移到低八位,再赋值给8位数据        

        TR0 = 1;

}


/***********************************************************

* 名    称: ServoPwmDutyCompare()

* 功    能: 脉宽变化比较及速度控制

* 入口参数: 无

* 出口参数: 无

* 说    明:                                          

/**********************************************************/

void ServoPwmDutyCompare()

{

        uint8 i;

        

        static uint16 ServoPwmDutyIncTimes;        //需要递增的次数

        static bool ServoRunning = 0;        //舵机正在以指定速度运动到指定的脉宽对应的位置

        if(ServoRunning == 0 && ServoPwmDutyHaveChange)//停止运动并且脉宽发生变化时才进行计算

        {

                ServoPwmDutyHaveChange = 0;

//                ServoPwmDutyIncTimes = ServoTime*2/5;        //ServoTime/(20/8)        //当每2.5ms调用一次ServoPwmDutyCompare()函数时用此句

                ServoPwmDutyIncTimes = ServoTime/20;        //当每20ms调用一次ServoPwmDutyCompare()函数时用此句

                for(i=0;i<8;i++)

                {

                        //if(ServoPwmDuty[i] != ServoPwmDutySet[i])

                        {

                                if(ServoPwmDutySet[i] > ServoPwmDuty[i])

                                {

                                        ServoPwmDutyInc[i] = ServoPwmDutySet[i] - ServoPwmDuty[i];

ServoPwmDutyInc[i] = -ServoPwmDu

[1] [2] [3] [4] [5]
关键字:STC单片机  舵机  pwm控制 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic489737.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:单片机8入8出场效应管控制板
下一篇:用C51单片机把只带的ADC(12bit)转换为RS232输出

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STC单片机内置EEPROM读取与保存 函数调用 .c和.h文件
);Save_Flash_Message(ks_Addr,Temp_Buf, 3);//保存    函数是 :void Save_Flash_Message(unsigned int Addr,unsigned char *Buf,unsigned int Len);现在是  无法保存  调取的也不对//以下为.h文件//使用单片机内部的Flash,模拟EEPROM使用//STC15W4K48S4 单片机,可以使用IAP命令擦写内部Flash//起始地址 0X0000 结束 0X27FF  其中,512Byte一个扇区//一共20个扇区  一个扇区可以存储一组参数
发表于 2020-02-16
STC单片机+DM134实现LED多段控制
 单片机源程序如下://============================================================================//================翼芯科技 LED流星灯8段16段==软件生成生成数据=================//============================================================================   //  此源码版权属 翼芯科技 全权享有,如欲引用,敬请署名并告知//         
发表于 2020-02-08
STC单片机+DM134实现LED多段控制
一文看懂STC单片机冷启动和复位有什么区别
  STC单片机简介  STC单片机是一款增强型51单片机,完全兼容MCS-51,还增加了新的功能,比如新增两级中断优先级,多一个外中断,内置EEPROM,硬件看门狗,具有掉电模式,512B内存等。还支持ISP下载,不用编程器,只要一个MAX232和一些廉价的元件就能写程序,可擦写10万次。因此是一款很好用的单片机。    stc单片机的优缺点  stc单片机优点:  1、抗干扰能力强;  2、保密性能强悍,很难被破解;  3、单片机时钟有防外部电磁辐射功能;  stc单片机缺点:  1、功耗较高,5V供电;  2、8位,运行速度慢;  3、无硬件乘法器,乘除法运算都为4周期指令;  4、单片机内集成资源少。  为什么STC单片机
发表于 2020-02-01
一文看懂STC单片机冷启动和复位有什么区别
STC单片机74HC595驱动8个数码管
74HC595驱动8个数码管源程序:/*---------------------------------------------------------------------*//* --- STC MCU International Limited ----------------------------------*//* --- STC 1T Series MCU Demo Programme -------------------------------*//* --- Mobile: (86)13922805190
发表于 2020-01-29
STC单片机不重新加电烧写方法
= 0;        while(10000>CNT++);}void soft_reset_to_ISP_Monitor(void){        IAP_CONTR = 0x60; //0110,0000 soft reset system to run ISP monitor}以上是个例子,利用STC_ISP_V483是可以的,其他版本未证实无法上传照片记得把0 1 2 3 4 5 6 7 8 9 A B C D E F 10拷贝到自定义下载中。
发表于 2020-01-19
51单片机-步进电机-舵机
1.文件文件下载地址https://download.csdn.net/download/weixin_43130546/121884292.电机分类驱动类电机——如:四驱车马达控制类电机反应式步进电机——性能差,已被淘汰永磁式步进电机——广泛用于消费产品如: 28BYJ-48 (4相永磁式步进电机)混合式步进电机——主要用于工业3.电机工作模式单四拍双四拍八拍4.说明P1_0-P1_4控制电机按键上正转按键下反转按键1-9转相应的圈数按键左反转90案件右正转90ESC暂停5.代码#include <reg52.h>sbit KEYOUT1 = P3^0;sbit KEYOUT2 = P3^1;sbit KEYOUT3
发表于 2020-03-06
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved