博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
利用WinCE的精准计时函数来输出pwm信号以便控制舵机
阅读量:5307 次
发布时间:2019-06-14

本文共 1961 字,大约阅读时间需要 6 分钟。

FL2440的板子只有TOUT0和TOUT1引出了扩展管脚,而TOUT0与GPB0复用,GPB0又连接着蜂鸣器,所以一用TOUT0输出pwm信号蜂鸣器就大叫不止,而TOUT1又因为Wince系统使用Timer1作为系统定时器,所以在Wince下用TOUT1输出pwm信号会马上死机。

本打算用定时器的中断函数来输出pwm信号,但是感觉WinCE封装ADS下的__irq函数很难搞,无意中发现WinCE有比较精准的计时函数,决定干脆用这个来做pwm信号以便控制舵机。

关键代码:

需要头文件:

#include "ceddk.h"#include "pkfuncs.h"#include "Windows.h"#include "Winbase.h"

 

1、ms级精准延时函数accurateDelay_ms(),主要知识点有LARGE_INTEGER数据类型,QueryPerformanceFrequency()函数来计算计数频率,QueryPerformanceCounter来计算起始计数和终止计数,起始计数与终止计数的差就是过程中产生了多少计数,再用这个过程计数除以计数频率,就是过程消耗的时间,这个时间比较灵活,用0.01进行因子计算就是ms级,用0.00001计算就是微秒级。输入参数n来决定延时n毫秒。

BOOL accurateDelay_ms(double n) //ms级的精确延时函数{    LARGE_INTEGER litmp;    LONGLONG QPart1,QPart2;    double dfFreq,dfMinus,dfTim;    QueryPerformanceFrequency(&litmp);    dfFreq = (double)litmp.QuadPart;//获得计数器的时钟频率    QueryPerformanceCounter(&litmp);    QPart1 = litmp.QuadPart;//获得当前初始值    do    {        QueryPerformanceCounter(&litmp);        QPart2 = litmp.QuadPart;//获得终止值        dfMinus = (double)(QPart2-QPart1);        dfTim = dfMinus/dfFreq;    }while(dfTim<0.01*n);    return TRUE;}

 

2、PWM信号产生函数:

功能:先逆时针旋转180度,然后顺时针旋转360度,再逆时针旋转180度回到起始位置。

通过int型变量duojiCnt来控制舵机转到哪个角度,通过每个while函数的第一个accurateDelay()来控制旋转的方向,每个while函数的第二个accurateDelay()来控制旋转快慢,delay()函数是个软件延时函数,delay(200)是为了保证舵机每一次都有充分的时间完成旋转。

duojiCnt = 11;    while(duojiCnt > 0)    {        v_IOPregs->rGPBDAT |= 1<<6;        accurateDelay_ms(0.1);        v_IOPregs->rGPBDAT &= ~(1<<6);        accurateDelay_ms(10);        duojiCnt--;    }    delay(200);    duojiCnt = 22;    while(duojiCnt > 0)    {        v_IOPregs->rGPBDAT |= 1<<6;        accurateDelay_ms(0.4);        v_IOPregs->rGPBDAT &= ~(1<<6);        accurateDelay_ms(10);        duojiCnt--;    }    delay(200);    duojiCnt = 12;    while(duojiCnt > 0)    {        v_IOPregs->rGPBDAT |= 1<<6;        accurateDelay_ms(0.1);        v_IOPregs->rGPBDAT &= ~(1<<6);        accurateDelay_ms(10);        duojiCnt--;    }    delay(200);

 

转载于:https://www.cnblogs.com/wuqi1003/p/3145428.html

你可能感兴趣的文章
ExtJs自学教程(1):一切从API開始
查看>>
redis详解(四)--高可用分布式集群
查看>>
IntelliJ IDEA 添加类注释模板
查看>>
acdream.Bet(数学推导)
查看>>
Oracle层次查询
查看>>
vue调试工具之 vue-devtools的安装
查看>>
UCOS2_STM32F1移植详细过程(一)
查看>>
laravel的速查表
查看>>
5-24
查看>>
Javascript一些小细节
查看>>
Struct
查看>>
在WPF程序中使用摄像头兼谈如何使用AForge.NET控件(转)
查看>>
Linux修改用户shell
查看>>
[译]我是怎么构建Node.js程序的
查看>>
suse 源的添加与删除,以及源地址
查看>>
56个 PHP 开发常用代码片段(上)
查看>>
maven安装与项目移植
查看>>
大数据告诉你互联网到底有多大?完全超出你想象!
查看>>
C语言输入日期计算是该年的第几天
查看>>
Caliburn v2 变更-模块化
查看>>