如何用stm32实现电子秤高精度测频

君,已阅读到文档的结尾了呢~~
高精度测频技术研究与实现,高精度北斗 实现,高精度频率计,高精度便携式频率计,高精度频率变送安全栅,stm32 高精度频率计,搜索引擎的研究与实现,文学研究助手的实现,研究生如何实现中国梦,网上商店的研究与实现
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
高精度测频技术研究与实现
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口stm32f030测10kHz左右的频率用这个方法是否可行? - STM32 - 意法半导体STM32/STM8技术社区
后使用快捷导航没有帐号?
查看: 869|回复: 4
stm32f030测10kHz左右的频率用这个方法是否可行?
在线时间8 小时
主题帖子精华
初级会员, 积分 60, 距离下一级还需 140 积分
初级会员, 积分 60, 距离下一级还需 140 积分
& && &需求是测量6路10kHz左右最大值5V占空比50%的方波信号,之前用Arduino UNO 也就是avr atmega328p 的程序来测频率,实现了一路的测量。
& && &它的方法就是定时器以系统频率(16MHz)一直计数,利用外部中断上升沿进中断,让定时器清零,下一个上升沿读取计数值后再清零,测量的频率就是系统频率除以这个计数值。
& && &因为我只要测10k左右,计数器不会溢出,所以就没设置定时器分频系数,但是avr单片机外部中断端口只有两个,就考虑用153之类的数据选择器来控制测量某一路信号。后来发现stm32f0的价格便宜,而且IO口可以自由设置外部中断,所以想把这个方法移植到m0上,不知道是否可行?我大概的构想就是设置同优先级的6个外部中断,在主函数里面循环对他们依次使能关闭延时,最后读出每一路的计数值计算各路频率。
& && &希望各位大神指点,或者比较一下这种方案和用数据选择器相比哪个更经济准确?谢谢
在线时间154 小时
主题帖子精华
金牌会员, 积分 1144, 距离下一级还需 1856 积分
金牌会员, 积分 1144, 距离下一级还需 1856 积分
用输入捕捉测量
结合各选择器切换 挺好的 呵呵
在线时间168 小时
主题帖子精华
金牌会员, 积分 1114, 距离下一级还需 1886 积分
金牌会员, 积分 1114, 距离下一级还需 1886 积分
IO翻转速率够,不成问题
在线时间176 小时
主题帖子精华
高级会员, 积分 965, 距离下一级还需 35 积分
高级会员, 积分 965, 距离下一级还需 35 积分
多路测频最好用TIMER的输入捕获功能。
如果用外部中断,有可能会由于中断函数的运行占用时间使得测频误差增大。
在线时间8 小时
主题帖子精华
初级会员, 积分 60, 距离下一级还需 140 积分
初级会员, 积分 60, 距离下一级还需 140 积分
多路测频最好用TIMER的输入捕获功能。
如果用外部中断,有可能会由于中断函数的运行占用时间使得 ...
正在学习输入捕获的章节,谢谢解惑
站长推荐 /3
意法半导体NFC/RFID产品线将于12月7-8日首次提供相关的RF系列产品设计深入培训。欢迎报名参加!
STM32粉丝狂欢节还剩最后一个月,最高单人可得5块开发板!11月中奖名单即将公布,请收到开发板的朋友好好学习!好好利用!
ST将于12月在北京/上海/深圳三地分别举办针对以太网(Ethernet)应用实战的线下培训。请尽快报名!
Tel: 3-8056
备案号: 苏ICP备号-2
Powered by基于STM32的高精度多圈绝对角度传感器_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
基于STM32的高精度多圈绝对角度传感器
上传于||暂无简介
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩1页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢博客访问: 1230070
博文数量: 372
博客积分: 8284
博客等级: 中将
技术积分: 4567
注册时间:
天行健,君子以自强不息
APP发帖 享双倍积分
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
很多人对等精度测频不是很了解,以前弄过,现在大致总结如下:
(注:硬件环境:DE2开发板 软件环境:quarter II 7.2)
整个系统总共有四个小的模块,分别是D_CON.vhd,lc_test.vhd,suo_fre.vhd,test_time.vhd
然后各自生成bsf模块文件。
新建一个工程,在新建的工程中添加上面的四个vhd文件和各自生成的bsf文件。
在新建的工程中新建一个bsf文件,然后将各个模块添加进来,连线效果图如下:
500)this.width=500;" border=0>
各个子模块代码如下:
library IEEE;use IEEE.std_logic_1164.use IEEE.std_logic_unsigned.
entity D_CON is&&& port (&&&& MK: in STD_LOGIC;&&&&&&&&&& &&&&&&&&&& FX :in& STD_LOGIC;&&&&&& &&&&&&&&&& CON:OUT STD_LOGIC&&&&&&&&&&& &&&&&&&& );end D_CON;architecture sc_arc of D_CON isbegin& process(FX)& & begin&&& if FX'event and FX='1'then&&&&&& CON<=MK;&&&&end sc_
test_time.vhd
library IEEE;use IEEE.std_logic_1164.use IEEE.std_logic_unsigned.
entity test_time is&&& port (&&clk_i: in STD_LOGIC;&&clk_25MHz_o : out STD_LOGIC;&&clk_10MHz_o : out STD_LOGIC;&&CLK_5Mhz_o: out STD_LOGIC;&&clk_1MHz_o : out STD_LOGIC;&&clk_200KHz_o : out STD_LOGIC;&&clk_1KHz_o : out STD_LOGIC;&&clk_500Hz_o : out STD_LOGIC;&&clk_100Hz_o : out STD_LOGIC;&&clk_10Hz_o : out STD_LOGIC;&&clk_2Hz_o : out STD_LOGIC;&&clk_1Hz_o : out STD_LOGIC;&&clk_2s_o : out STD_LOGIC&&& );end test_
architecture test_time_arch of test_time is&signal clk_25MHz,clk_5MHz: STD_LOGIC;&signal clk_10MHz : STD_LOGIC;&signal clk_1MHz : STD_LOGIC;&signal clk_200KHz : STD_LOGIC;&signal clk_1KHz : STD_LOGIC;&signal clk_500Hz : STD_LOGIC;&signal clk_100Hz : STD_LOGIC;&signal clk_10Hz : STD_LOGIC;&signal clk_2Hz : STD_LOGIC;&signal clk_1Hz : STD_LOGIC;&signal clk_2s : STD_LOGIC;&begin&&& clk_25MHz_o <= clk_25MHz;&&&& clk_5MHz_o <= clk_5MHz;&clk_10MHz_o <= clk_10MHz;&clk_1MHz_o <= clk_1MHz;&clk_200KHz_o <= clk_200KHz;&clk_1KHz_o <= clk_1KHz;&clk_500Hz_o <= clk_500Hz;&clk_100Hz_o <= clk_100Hz;&clk_2Hz_o <= clk_2Hz;&clk_1Hz_o <= clk_1Hz;&clk_2s_o <= clk_2s;process( clk_i )variable t : integer range 0 to 5;begin&if ( clk_i 'event and clk_i = '1' ) then&&if ( t = 1 ) then&&&t := 0;&&&clk_25MHz <= '1';&&else&&&t := t + 1;&&&clk_25MHz<='0';&&&&&&
process( clk_i )variable t : integer range 0 to 5;begin&if ( clk_i 'event and clk_i = '1' ) then&&if ( t = 4 ) then&&&t := 0;&&&clk_10MHz <= '1';&&else&&&t := t + 1;&&&clk_10MHz<='0';&&&&&
process( clk_i )variable t : integer range 0 to 5;begin&if ( clk_i 'event and clk_i = '1' ) then&&if ( t = 9 ) then&&&t := 0;&&&clk_5MHz <= '1';&&else&&&t := t + 1;&&&clk_5MHz<='0';&&&&&
process( clk_i )variable t : integer range 0 to 24;begin&if ( clk_i 'event and clk_i = '1' ) then&&if ( t = 24 ) then&&&t := 0;&&&clk_1MHz <= not clk_1MHz;&&else&&&t := t + 1;&&&&&
process( clk_1MHz )variable t : integer range 0 to 499;begin&if ( clk_1MHz 'event and clk_1MHz = '1' ) then&&if ( t = 499 ) then&&&t := 0;&&&clk_1KHz <= not clk_1KHz;&&else&&&t := t + 1;&&&&&
process( clk_1MHz )variable t : integer range 0 to 4;begin&if ( clk_1MHz 'event and clk_1MHz = '1' ) then&&if ( t <3& ) then&&&clk_200KHz <= '0';&&else&&&clk_200KHz <= '1';&&&&&&&&if ( t = 4& ) then&&&t :=0;&&else&&&t := t + 1;&&&
process( clk_1KHz )variable t : integer range 0 to 4;begin&if ( clk_1KHz 'event and clk_1KHz = '1' ) then&&if ( t = 4 ) then&&&t := 0;&&&clk_100Hz <= not clk_100Hz;&&else&&&t := t + 1;&&&&&
process( clk_1KHz )variable t : integer range 0 to 1;begin&if ( clk_1KHz 'event and clk_1KHz = '1' ) then&&if ( t = 1 ) then&&&clk_500Hz <= not clk_500Hz;&&&&&&t := t + 1;&
process( clk_100Hz )variable t : integer range 0 to 4;begin&if ( clk_100Hz 'event and clk_100Hz = '1' ) then&&if ( t = 4 ) then&&&clk_10Hz <= not clk_10Hz;&&&t := 0;&&else&&&t := t + 1;&&&&&
process( clk_100Hz )variable t : integer range 0 to 24;begin&if ( clk_100Hz 'event and clk_100Hz = '1' ) then&&if ( t = 24 ) then&&&clk_2Hz <= not clk_2Hz;&&&t := 0;&&else&&&t := t + 1;&&&&&&process( clk_2Hz )variable t : integer range 0 to 1;begin&if ( clk_2Hz 'event and clk_2Hz = '1' ) then&&if ( t = 1 ) then&&&clk_1Hz <= not clk_1Hz;&&&t := 0;&&else&&&t := t + 1;&&&&&&process( clk_1Hz )variable t : integer range 0 to 1;begin&if ( clk_1Hz 'event and clk_1Hz = '1' ) then&&if ( t = 1 ) then&&&clk_2s <= not clk_2s;&&&t := 0;&&else&&&t := t + 1;&&&&&&end test_time_
lc_test.vhd
library IEEE;use IEEE.std_logic_1164.use IEEE.std_logic_unsigned.use IEEE.std_logic_arith.
entity lc_test is&&& port (&&&& clr,fs,door: in STD_LOGIC;&&&& &&&&&&&&&&&&&&&&&&&&& &&&&&&&&&& freq:out std_logic_vector(31 downto 0)&&&&&&&& );end lc_
architecture corn_arc of lc_test issignal t2: std_logic_vector(31 downto 0);signal fs_test:INTEGER range 0 to ;begin&& process(fs,clr)-- N1&&& variable t :std_logic_vector(31 downto 0);&&& begin &&&&& if(clr='0') then&&&&&&&&& t:=(OTHERS=>'0');&&&&& elsif(fs'event and fs='1') then&&&&&&& if(door='1') then&&&&&&&& t:=t+1;&&&&&&& --else&&&&&&& -- t:=(OTHERS=>'0');&&&&&&&& &&&&&&&& freq<=t;&&end corn_
suo_frq.vhd
library IEEE;use IEEE.std_logic_1164.use IEEE.std_logic_unsigned.
entity suo_frq is&&& port (&&&& en: in STD_LOGIC;&&&&&&&&&& &&&&&&&&&& data_i : in std_logic_vector(31 downto 0);&&&&&&&&&&&&&&&& &&&&&&& data_o:out& std_logic_vector(31 downto 0)&&&&&&&& );end suo_
architecture sc_arc of suo_frq isbegin & process(en) & begin&&& if en'event and en='1'then&&&&&& data_o<=data_i;&&&&end sc_
需要说明的是:
连线图中:
CLK_50是一个50M信号的输入引脚,大家也可以根据自己的具体的晶振的频率编写自己的分频模块test_time,只要有1hz和25Mhz的输出信号即可。
FX是被测信号的输入管脚,输入的数字电平的高逻辑是3.3v,低逻辑是0v。
FLAG_DOWN_OUT是输出管脚,连接到CPU的外部中断管脚,一旦测好一次数据,模块自己产生一个下降沿,使CPU产生外部中断,让CPU从NX_OUT以及NS_OUT这两根32位数据总线把数据读走。这里的CPU既可以是硬核,也可以是软核(例如NIOS II)。最后由CPU计算出频率:
& fre=(/NS)*NX;//计算
上传编译成功的工程文件如下:
my等精度测频模块.rar
阅读(1334) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。}

我要回帖

更多关于 高精度分频器 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信