找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: Y_G_G
打印 上一主题 下一主题
收起左侧

想判断一个数中"1"的个数的多少,有没有什么高效的算法

  [复制链接]
41#
ID:688692 发表于 2022-10-24 19:09 来自手机 | 只看该作者
cnos 发表于 2022-10-24 16:49
楼主是需要多快的响应速度呢?还是这个响应速度是动态可变的?比如你采样的速度是多少,出现多少个连续的0 ...

没错的,我问的就是过了抖动区,就是连续的0和1了。那么,多少个连续的0或者1可以认为是确切变了?
回复

使用道具 举报

42#
ID:401564 发表于 2022-10-24 19:53 | 只看该作者
cnos 发表于 2022-10-24 19:09
没错的,我问的就是过了抖动区,就是连续的0和1了。那么,多少个连续的0或者1可以认为是确切变了?

要这么简单就好了
假设抖动3次,你再以检测到两个1,就判定为一个上升沿
那么,最坏的情况就是,在第一次抖动的时候,就已经是过零点了,再经过后面4次,就是40uS,等于是你判定为过零的点的时间,比实际的时间晚了40uS
这个在低速的时候是没有问题的
但在高速的时候,两次过零之间的间隔也才100uS甚至更少,根本就检测不到正常的过零点
而且,这个抖动并不是相对固定的,在低速的时候,可能会出现几十次的抖动,但在高速的时候,可能没有或者一两次抖动,这是我用示波器看过了的
不过,现在我用ADC来检测了,效果相对要好点
我只是想知道一些算法而已,因为马云家卖的驱动板,人家也是用比较器检测过零的,人家一样能做到近10万转/分的转速,有点好奇,但网上也是找了好久,都没有找到相关的代码
回复

使用道具 举报

43#
ID:57657 发表于 2023-1-28 17:16 | 只看该作者
查表浪费内存空间,循环语句浪费时间,还是Verilog划算:
  1. module main(
  2.         input [7:0] in,                        //字节输入
  3.         output reg [3:0] out                //二进制1的数量
  4. );
  5. reg [2:0] i;
  6. always @(*) begin
  7.         i = 3'd0;
  8.         out = 4'd0;
  9.         repeat(8) begin
  10.                 if(in[i]) begin
  11.                         out = out + 4'd1;
  12.                 end
  13.                 i = i + 3'd1;
  14.         end
  15. end
  16. endmodule
复制代码
回复

使用道具 举报

44#
ID:1034262 发表于 2024-7-25 13:52 | 只看该作者
查表最快,256个字节的表。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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