历史上的今天
返回首页

历史上的今天

今天是:2025年02月27日(星期四)

正在发生

2020年02月27日 | STC单片机关于舵机pwm控制源程序(单个与多个速度控制都有)

2020-02-27 来源:51hei

单片机源程序如下:

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

** 文件: 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] = -ServoPwmDutyInc[i];

                                }

                                else

                                {

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

                                        

                                }

                                ServoPwmDutyInc[i] /= ServoPwmDutyIncTimes;//每次递增的脉宽

                        }

                }

                ServoRunning = 1;        //舵机开始动作

        }

        if(ServoRunning)

        {

                ServoPwmDutyIncTimes--;

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

                {

                        if(ServoPwmDutyIncTimes == 0)

推荐阅读

史海拾趣

启珑(CHIPLON)公司的发展小趣事

一次性生成5个关于启珑(CHIPLON)公司在电子行业发展起来的相关故事可能内容过多,我可以先为您提供1个相关故事作为示例,如您满意,我可以继续提供。

启珑微电子推出创新DSP系列

近年来,随着数字技术的飞速发展,电子行业对高性能处理器的需求日益增长。在这一背景下,启珑微电子(CHIPLON)凭借其深厚的技术积累和敏锐的市场洞察力,成功推出了全新的CLM320F28335系列DSP(数字信号处理器)。

这款产品一经发布,就引起了行业内的广泛关注。CLM320F28335系列DSP以其高效的32位RISC-V CPU内核、高精度、低成本、低功耗、高性能以及外设集成度高等特点,迅速在市场中占据了一席之地。与传统的定点DSP相比,这款产品的优势显而易见,尤其是在数据处理和A/D转换方面表现更为出色。

值得一提的是,CLM320F28335系列DSP拥有150MHz的高速处理能力,并配备了32位浮点处理单元,这使其在处理复杂算法和大量数据时能够游刃有余。同时,它还具备6个DMA通道,支持ADC、McBSP和EMIF,以及多达18路的PWM输出,其中有6路为高精度PWM输出(HRPWM),这些特性使其在工业自动化、电机控制等领域具有广泛应用前景。

该产品设计的另一个亮点是,它能够直接PIN对PIN替代国际同类产品,这意味着用户在使用启珑的DSP时,无需更改原有的电路板设计或系统软件,即可实现完全的替代兼容,这一设计无疑大大降低了用户的替换成本和使用难度。

随着CLM320F28335系列DSP的成功推出,启珑微电子在电子行业的地位得到了进一步提升。这一产品的成功,不仅展示了启珑微电子强大的研发实力,也为其在激烈的市场竞争中赢得了更多的市场份额。

若您想要探索更多内容,随时可以继续输入。

台湾君耀(Brightking)公司的发展小趣事

君耀(Brightking)公司于1996年在台湾新竹高科技园区创立,初期专注于防雷元器件的研发和生产。凭借对技术的深入研究和市场需求的敏锐洞察,君耀逐步在台湾的电子器件市场上占得一席之地。随着产品质量和技术含量的提升,君耀的产品开始受到国内外客户的青睐,销售网络逐渐拓展至全球。

中科银河芯(GXCAS)公司的发展小趣事
在饱和状态下,集电极和发射极之间的电压降(Vce)很小,通常在0.3V到0.4V之间。这意味着三极管在这两个极之间相当于一个低阻值的开关。
EVER-WAY公司的发展小趣事

EVER-WAY公司成立于XX世纪初,当时电子行业正处于蓬勃发展的阶段。创始人李明看准了市场机遇,决定创立一家专注于电子元器件制造的公司。他带领一支由几名工程师组成的小团队,开始了艰苦的创业之路。初期,公司面临着资金短缺、技术落后和市场竞争激烈等多重挑战。然而,李明和他的团队凭借坚定的信念和不懈的努力,逐渐在市场中站稳脚跟。他们不断优化产品性能,提高生产效率,同时积极拓展国内外市场,逐步扩大了公司的知名度和影响力。

EDAC公司的发展小趣事

随着全球环保意识的提高,ECS-C公司积极响应国家号召,将绿色环保理念融入到企业的生产经营中。公司采用环保材料和生产工艺,减少废弃物排放和能源消耗。同时,ECS-C公司还积极参与环保公益活动,推动社会环保事业的发展。这些环保举措不仅提升了公司的社会形象,也为企业带来了可持续发展的动力。

High Voltage Power Solutions Inc公司的发展小趣事

ECS-A公司是一家专注于电子元器件生产的公司。在发展过程中,ECS-A公司意识到全球化是不可避免的趋势。因此,公司决定实施全球化战略,通过在海外设立生产基地、研发中心和销售网络,拓展国际市场。经过多年的努力,ECS-A公司的产品已经出口到全球多个国家和地区,公司也在多个国家和地区建立了分支机构。这一全球化战略不仅使ECS-A公司的销售额持续增长,也提升了公司的国际竞争力。

问答坊 | AI 解惑

请大家推荐符合要求的单片机

要求如下: 有两个串口 有大的flash (类似于P89C669有96k的flash)。…

查看全部问答>

Wince 应用程序不能截获VK_MENU按键

C/C++ code //Send.exe     keybd_event(VK_MENU, 0x0, KEYEVENTF_SILENT, 0);     keybd_event(VK_MENU, 0x0, KEYEVENTF_SILENT | KEYEVENTF_KEYUP, 0); //Rev.exe BOOL CRev::PreTranslateMessage(MSG* pMsg) {   &n ...…

查看全部问答>

SHNotificationAdd在WINCE 5.0 .net下不弹出气泡通知

如下代码在windows mobile手机上是可以弹出气泡的,但是在wince 5.0开发板上弹不出来.根据MSDN似乎应该是可以的。 SHNP_INFORM Notification bubble displays for the set duration, then disappears. Note For Windows Mobile, this enum ...…

查看全部问答>

懂VB的近来帮下忙

本人用VS2005 编译了一个串口通讯的小软件  用VB写的  为什么当串口一收到数据的时候就弹出以下错误 错误 Temper11.exe NotSupportedException Control.Invoke 必须用于与在独立线程上创建的控件交互。 位于 Microsoft.A ...…

查看全部问答>

SM501不能工作!

CPU:S3C2440 调试环境:H-JTAG+ADS1.2 问题:读出501ID号不对 详述:501作为2440的图像显示模块,与2440连接方式为非 UMA方式,MMIO_BASE=0x2000_0000+0x03E0_0000,501上电 后MMIO_BASE+0x000060寄存器中初始化为0x0501xxa0,但 目前读出的数据 ...…

查看全部问答>

半导体公司招聘(北京) S/W Engineer

1. S/W Engineer (Codec) 1) 4+ years working experience of video, audio codec development 2) Candidates should have strong knowledge and hands-on experience on MPEG-2/4, H.264, AAC/AAC+ algorithm 3) C/C++ and Verilog HDL program ...…

查看全部问答>

ISE初学问题求助?

ERROR: The Top module has not been specified. This can happen if no sources have been added to the project, 是什么意思?…

查看全部问答>

有人用过MSP4250吗?

这芯片怎么回事,我使用了SD16A的第一、二、三通道(AIN0、AIN1、AIN2),每五通道(AIN4)与TIMERA的PWM(TA1、TA2)是同一个引脚。我使用了PWM输出。在使用中发现,只要我打开SD16A的第三通道,TA1引脚输出就一直为低电平,不受PWM控制,当我关掉 ...…

查看全部问答>

这是真正的LaunchPad 材料。

有安装软件、有例子、有GRCC使用等等!…

查看全部问答>

求教VxWorks 的DOSFS 在SD卡上的构建

我在SD卡上构建dosfs文件系统是总是出错: 代码如下 #include \"copyright_wrs.h\"#include \"vxWorks.h\"#include \"taskLib.h\"#include \"blkIo.h\"#include \"stdlib.h\"#include \"stdio.h\"#include \"string.h\"#include \"dosFsLib.h\"#i ...…

查看全部问答>