打印
[国产单片机]

测电机转速程序是转每秒,怎么通过代码转换成转每分

[复制链接]
3759|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
张雪and明|  楼主 | 2016-3-12 09:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
ghost_z| | 2016-3-14 10:22 | 只看该作者
*60

使用特权

评论回复
板凳
Latin_newday| | 2016-3-14 11:28 | 只看该作者
楼上正解!

使用特权

评论回复
地板
张雪and明|  楼主 | 2016-3-17 13:44 | 只看该作者

……我当然知道乘以60啊,我想知道的是通过代码怎么实现

使用特权

评论回复
5
changle11sdo5| | 2016-3-17 19:28 | 只看该作者
霍尔加中断

使用特权

评论回复
6
changle11sdo5| | 2016-3-17 19:33 | 只看该作者
代码就不发了,之前做的加了很多功能,要删减,麻烦

使用特权

评论回复
7
yjj909334873| | 2016-3-17 19:45 | 只看该作者
原来每秒转数是怎么采集的呢?比较简单的方法可以将你每秒转数得到的值那个位置的定义的数进行*60的操作,也可以定时的时间作为一分钟

使用特权

评论回复
8
张雪and明|  楼主 | 2016-3-18 10:07 | 只看该作者
yjj909334873 发表于 2016-3-17 19:45
原来每秒转数是怎么采集的呢?比较简单的方法可以将你每秒转数得到的值那个位置的定义的数进行*60的操作, ...

我试过定时时间设置1分钟,但是num++至少要到1200,这样改了之后,lcd一直显示0,不知道是不是运算太慢

使用特权

评论回复
9
张雪and明|  楼主 | 2016-3-18 10:11 | 只看该作者
张雪and明 发表于 2016-3-18 10:07
我试过定时时间设置1分钟,但是num++至少要到1200,这样改了之后,lcd一直显示0,不知道是不是运算太慢 ...

uint8 display[10]={"    r/sec"};         // 定义显示参数

/*LCD显示函数*/
void displaytolcd()
{
        w_cmd(0x80);                               //向LCD1602写命令80H
        for (i=0;i<sizeof(display)-1;i++)          //循环要传输的字符个数次,每一次传输一个字符
                {
                w_dat(display);
                delay_ms(5);
                }
}


在哪个位置乘以60?

使用特权

评论回复
10
gmm2015| | 2016-3-18 15:14 | 只看该作者
张雪and明 发表于 2016-3-18 10:11
uint8 display[10]={"    r/sec"};         // 定义显示参数

/*LCD显示函数*/

在你将转速值传递给 display[10]数组之前乘以60
你看看你的代码将转速值转换到   display[10]的函数

使用特权

评论回复
11
singleMCU| | 2016-3-23 11:47 | 只看该作者
如果只是乘上60那么你的单次的误差也会扩大60倍,不建议这么做。本身的计数用的那个定时器一定要累加计数,这里可以建立一个数组60个元素记录60秒的数据,首次的这个刷新可能要等1分钟才能出来准确的数据,之后的记录了61秒的就减去第1秒的这样精确度能好很多。下面有个参考程序,有一定的差别希望能助你参考
////////////////////////////////////////////////////////////
//程序名称:车速测量
//编写:DREAMER开发板(淘宝店)
//简介:本程序通过单片机对光电脉冲计数模块产生的脉冲计数
//实现对电机速度进行测量的目的
////////////////////////////////////////////////////////////
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include<stdio.h>
#include"1602.h"
#include"delay.h"
#define HIGH (65536-50000)/256
#define LOW  (65536-50000)%256

//sbit LED=P1^2;    //定义LED端口
bit OVERFLOWFLAG;
bit TIMERFLAG;
/*------------------------------------------------
                    定时器0初始化子程序

使用特权

评论回复
12
singleMCU| | 2016-3-23 11:56 | 只看该作者
////////////////////////////////////////////////////////////
//程序名称:车速测量
//编写:DREAMER开发板
//简介:本程序通过单片机对光电脉冲计数模块产生的脉冲计数
//实现对电机速度进行测量的目的
////////////////////////////////////////////////////////////
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include<stdio.h>
#include"1602.h"
#include"delay.h"
#define HIGH (65536-50000)/256
#define LOW  (65536-50000)%256

//sbit LED=P1^2;    //定义LED端口
bit OVERFLOWFLAG;
bit TIMERFLAG;
/*------------------------------------------------
                    定时器0初始化子程序
                                        本程序用于计数
------------------------------------------------*/
void Init_Timer0(void)
{
TMOD |= 0x01 | 0x04;          //使用模式1,16位计数器,使用"|"符号可以在使用多个定时器时不受影响                     
TH0=0x00;                      //给定初值
TL0=0x00;         
EA=1;                    //总中断打开
ET0=1;                   //定时器中断打开
TR0=1;                   //定时器开关打开
}
/*------------------------------------------------
                    定时器1初始化子程序
                                        本程序用于定时
------------------------------------------------*/
void Init_Timer1(void)
{
TMOD |= 0x10;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
TH1=HIGH;              //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出
TL1=LOW;
EA=1;            //总中断打开
ET1=1;           //定时器中断打开
TR1=1;           //定时器开关打开
}
/*------------------------------------------------
                    主程序
------------------------------------------------*/
main()
{
float a;
char temp[16];      //定义字符显示缓冲数组
Init_Timer0();      //初始化定时器0
Init_Timer1();      //初始化定时器1
LCD_Init();         //初始化液晶屏
delay_ms(10);       //延时用于稳定,可以去掉
LCD_Clear();        //清屏
LCD_Write_String(0,0,"ssssssssss");//写入第一行信息,主循环中不再更改此信息,所以在while之前写入
while(1)
{
  if(OVERFLOWFLAG)//检测溢出标志,如果溢出表明频率过高,显示溢出信息
    {
         OVERFLOWFLAG=0;//标志清零
     LCD_Write_String(0,1,"overflow >655KHz");
        }
  if(TIMERFLAG)     
    {
         a=TL0+TH0*256;//读取计数值
         a=a*8;
         a=a/20;
         a=a/3;

     sprintf(temp,"%8.2f cm/s",a);
     LCD_Write_String(0,1,temp);//显示到液晶第二行
         TR0=1;                     //2个定时器打开
         TR1=1;
         TH0=0;                     //保证计数器初值为0
         TL0=0;
         TIMERFLAG=0;               //打开计时计数标志
         
        }
  }
}

/*------------------------------------------------
                 定时器0中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1
{
TH0=00;              //重新给定初值
TL0=00;

OVERFLOWFLAG=1;  //溢出标志

}
/*------------------------------------------------
                 定时器1中断子程序
------------------------------------------------*/
void Timer1_isr(void) interrupt 3
{
static unsigned char i;
TH1=HIGH;                 //重新赋值10ms
TL1=LOW;

i++;
if(i==60)       //50ms 计数时间单位,得出50ms脉冲个数 x60就是3s中脉冲个数
   {
   i=0;
   TR0=0;        //2个定时器关闭
   TR1=0;
   TIMERFLAG=1;  //标志位清零
   TH1=HIGH;         //重新赋值
   TL1=LOW;
   }
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

22

帖子

1

粉丝