找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 968|回复: 3
打印 上一主题 下一主题
收起左侧

单片机接收PWM显示转速问题

[复制链接]
跳转到指定楼层
楼主
下面有两块板,绿色的数码管是显示转速的,红色的数码管是显示clock信号的,也就是显示频率的,比如当红色的数码管手动调到200Hz时,绿色数码管就要显示800转速,这是个假设,不一定只显示800转,看电机是几对极来计算,现在绿色数码管的板子上引了一根通讯线与红色数码管的PWM线相连,打算用这根线来接收红色数码管通讯线的脉冲,然后将他转换得到转速显示在绿色数码管上,目前我需要知道一个思路,因为我写出来的没有实现出来,请大伙给个思路或函数框架。

51hei图片_20230730151138.jpg (2.97 MB, 下载次数: 39)

51hei图片_20230730151138.jpg
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 2023-7-30 21:56 | 只看该作者
适用于1000转/分钟以内
  1. #include <reg51.H>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint  unsigned int
  5. #define ulong unsigned long
  6. #define DASE 60000

  7. //全局变量声明
  8. //                     数据头 方向位  高位  低位  验证  数据尾
  9. uchar data dis_buf[6]={ 0xaa,  0x00,  0x00, 0x00, 0xff,  0x55 };
  10. uint  D_num;            //定时器中断计数变量
  11. uint  speed=0;          //转速
  12. uint  temp=0;           //T0中断计数临时变量                                       
  13. uint  count=0;                        //主循环计数变量
  14. uchar flag_Z=0;         //外部中断标志
  15. bit   flag_D=0;         //T0中断标志
  16. //---本地函数声明---//
  17. void Timer0Init();      //定时器T0初始化
  18. void UartInit();        //定时器T1初始化波特率
  19. void Delay_ms(uint t);  //延时函数

  20. //主函数
  21. void main()
  22. {
  23.         uchar k;
  24.         Timer0Init();                        //初始化定时器0
  25.         UartInit();                                //初始化定时器1波特率发生器
  26.         Delay_ms(100);                        //长延时100ms
  27.         IE0 = 0;                                //INT0中断请求标志清0
  28.         IT0 = 1;                                //设置外部下降沿中断
  29.         EX0 = 1;                                //开INT0中断
  30.         ET0 = 1;                                //开T0中断
  31.         EA  = 1;                                //开总中断
  32.         Delay_ms(100);                        //长延时100ms
  33.         flag_Z=0;                                //外部中断标志初始0,消除加电时外部中断的一次触发
  34.         while(1)
  35.         {
  36.                 if(flag_D==1)                                        //定时器中断250ms
  37.                 {
  38.                         flag_D=0;                                        //定时器中断标志清0
  39.                         count++;                                        //250ms计数++
  40.                         if(flag_Z==3)                                //外部中断标志
  41.                         {
  42.                                 flag_Z=2;                                //外部中断标志复位
  43.                                 speed=DASE/D_num;                //计算转速 r/min
  44.                                 dis_buf[2]=speed>>8;        //转速高8位
  45.                                 dis_buf[3]=speed;                //转速低8位
  46.                                 count=0;                                //250ms计数清0
  47.                         }
  48.                         else if(count>24)                        //否则 如果持续6秒收不到外部中断信号清一次所有信息
  49.                         {
  50.                                 count=0;
  51.                                 speed=0;                                //转速清0
  52.                                 dis_buf[2]=0x00;                //转速高位缓存清0
  53.                                 dis_buf[3]=0x00;                //转速低位缓存清0
  54.                                 D_num=0;                                //定时器中断缓存清0
  55.                                 temp=0;                                        //定时器中断变量清0
  56.                                 flag_Z=0;                        //外部中断标志清0
  57.                         }
  58.                         dis_buf[4]=dis_buf[0]+dis_buf[1]+dis_buf[2]+dis_buf[3]+dis_buf[5];//计算验证码
  59.                         for(k=0;k<6;k++)
  60.                         {
  61.                                 SBUF = dis_buf[k];                //串口发送数据串
  62.                                 while(!TI);                                //等待串口发送中断请求标志位为1
  63.                                 TI=0;                                        //串口发送中断请求标志清0
  64.                         }
  65.                 }
  66.         }
  67. }   
  68. //T0中断服务函数 周期1ms
  69. void Timer0Interrupt() interrupt 1
  70. {
  71.         static uint i;
  72.         temp++;
  73.         i++;
  74.         if(i>=250)                                //250ms
  75.         {
  76.                 i=0;
  77.                 flag_D=1;                        //T0中断标志
  78.         }
  79. }
  80. //INT0中断服务函数
  81. void INT0_Isr() interrupt 0
  82. {
  83.         TR0=0;                                        //关定时器0
  84.         D_num=temp;                                //读取定时器1ms中断计数值
  85.         temp=0;                                        //定时器1ms中断计数值清0
  86.         TL0 = 0x66;                                //设置定时初始值
  87.         TH0 = 0xfc;                                //设置定时初始值
  88.         TR0=1;                                        //开定时器0
  89.         if(++flag_Z>=3)                        //判断外部(霍尔)中断,用于起步消除错误计数               
  90.                 flag_Z=3;
  91. }
  92. //延时函数
  93. void Delay_ms(uint t)                //@11.0592MHz
  94. {
  95.         uint i,j;
  96.         for(i=t;i>0;i--)
  97.                 for(j=110;j>0;j--);
  98. }
  99. //初始化定时器T0
  100. void Timer0Init()                        //1毫秒@11.0592MHz
  101. {
  102.         TMOD|= 0x01;                        //设置定时器16位自动重载模式
  103.         TL0 = 0x66;                                //设置定时初始值
  104.         TH0 = 0xfc;                                //设置定时初始值
  105.         TF0 = 0;                                //清除TF0标志
  106.         TR0 = 1;                                //定时器0开始计时
  107. }
  108. //初始化串口T1
  109. void UartInit()                                //9600bps@11.0592MHz
  110. {
  111.         SCON = 0x50;                        //8位数据,可变波特率
  112.         TMOD|= 0x20;                        //设置定时器模式
  113.         TL1 = 0xfd;                                //设置定时初始值
  114.         TH1 = 0xfd;                                //设置定时初始值
  115.         ET1 = 0;                                //禁止定时器中断
  116.         TR1 = 1;                                //定时器1开始计时
  117. }
复制代码



回复

使用道具 举报

板凳
ID:320306 发表于 2023-7-31 09:20 | 只看该作者
你需要把控制电机的PWM信号变成频率信号调节电机的速度 频率是不变的,所以你目前应该不行,要么用程序,采集占空比输出频率也可以!要么就直接用单片机驱动两个数码管显示,然后单片机输出PWM控制最简单。
回复

使用道具 举报

地板
ID:123289 发表于 2023-7-31 16:20 | 只看该作者
这是硬件问题。需要一个PWM电压与转速的对应关系。这个关系与硬件相关,你能找出这个关系吗。
认真读相关硬件的手册吧。尤其是电机。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表