×

带Arduino和X9C104数字控制电位器的伪锁相环

消耗积分:2 | 格式:zip | 大小:0.03 MB | 2023-02-08

张杰

分享资料个

描述

带 Arduino 和 X9C104 数字控制电位器 (XDCP) 的伪锁相环

该项目展示了如何使用带有 X9C104 的 Arduino 来实现频率发生器,以便使用反馈回路优化频率。这是 PLL 电路中使用的原理。

该项目展示了 X9C104 IC 如何由 Arduino 控制并在带有 555 定时器电路的反馈回路中使用以输出用户所需的输入频率。通过使用连接到 Arduino 中断的反馈回路将此频率设置为接近输入。

 

poYBAGPjH_iAA_xgAAikvKqSs6A073.jpg
显示中断反馈的完整电路
 

电路的简化框图如下所示:

 

pYYBAGPjH_uALEJGAAA25g1WkEQ663.png
整体框图
 

基本操作原理:

  • 用户通过 Arduino 串行监视器输入所需的频率。
  • Arduino 接受输入并将 X9C104 编程为初始设置
  • 555定时器电路中的X9C104电阻调节振荡频率
  • 产生的方波被反馈到 Arduino 中断(引脚 2)
  • 使用中断处理例程,确定方波的频率
  • 将该频率与要求的频率进行比较并对 X9C104 进行调整
  • 再次测量频率并执行第二次优化
  • 555 定时器输出方波的频率稳定到用户在步骤 1 中设置的值

X9CXXX 数控电位器 (XDCP)

X9CXXX 集成电路由 Intersil(最近被 Renesas Corporation 收购)制造,代表其数字控制电位器系列。该装置包括电阻阵列、控制部分和非易失性存储器。阵列的电阻由三线数字接口控制。

来自 Intersil 数据表的框图:

 

poYBAGPjH_2AIXE2AABACy9jTv0148.png
X9CXXX 框图
 

该器件可用作二端可变电阻器或三端电位器。它包括非易失性存储器,可在掉电时保存最后一个电阻值,并在随后的上电时将电阻器阵列设置为此值。

滑动器位置的控制以及电阻由三个数字输入决定:

  • 通过将 CS 拉低来选择设备。
  • 向上/向下 (U/D) 的状态决定了滑动端是靠近 Vh/Rh 还是靠近 Vl/Rl。
  • 每次 INC 被拉低然后返回高电平时,滑动器移动一步。
  • 滑动器有 100 个可能的位置 (0 – 99),允许以总阻力的 1% 为增量步长。
  • 当游标到达顶部或底部(Vh/Rh 或 Vl/Rl)时,它不会再移动,也不会环绕到另一个极端。

重要的是要记住,对于每个 INC 周期,滑动器移动一个增量。擦拭器不能跨越多个步骤。这意味着从第 10 步移动到第 20 步需要 10 个 INC 周期。

Vh 和 Vl 不能超过 Vcc 和 Vss。

可在 Renesas 网站上找到设备的完整规格。

项目电路

本项目中使用的 555 定时器电路是标准的非稳态振荡器。有多篇文章记录了该电路的工作原理,快速搜索即可找到相关说明。

 

pYYBAGPjIACATEq9AABazyY9_To850.png
电路图
 

在高层次上,操作如下:

  • 引脚 7 为高电平时,电容器 C1 通过 R1 和 X9C104 中的可变电阻器充电
  • 在某个阈值电压下,555 定时器内部触发器 s1 开关和引脚 7 变为低电平
  • 然后电容 C1 通过 X9C104 中的可变电阻放电。
  • 在较低的阈值电压下,55 定时器内部触发器切换回来并重复该循环。

频率和占空比的公式如下:

 

poYBAGPjIAaARTj3AAArJpn5FB8768.png
频率和占空比
 

此处使用的电路中,R2 为 100 kΩ(X9C104),R1 为 1 kΩ。由于存在差异,电路的频率和占空比实际上由 R2 的值设置,除非 R2 的值非常低。这意味着可以忽略 R1,频率方程可以简化为:

 

pYYBAGPjIAmAI2_fAAAQUuj3a4Y142.png
简化的频率方程
 

要计算将导致所需频率变化的电阻变化,一些数学将显示

 

poYBAGPjIA-AaagTAAAU5EwBY8U402.png
三角电阻
 

选择 R1、R2 和 C1 的值,以便电路生成可听频率范围内的方波。

本文开头的照片显示了物理电路。

Arduino 中断

Arduino 板核心的 ATmega328P 接受中断。有效中断会停止当前程序流并启动中断服务例程,该例程会在将控制权交还给先前的程序流之前完成一些操作。

有关 Arduino 中断的详细说明,请参阅 Arduino 语言参考和Nick Gammon 撰写的精彩文章

请注意,Arduino 指令集中可用的一些标准函数(例如 delay() 和 millis())将无法在中断服务例程中运行,因为这些函数依赖于中断本身来运行。

在 Arduino 代码中,使用 attachInterrupt() 命令打开中断。本项目使用的命令具体版本如下:

attachInterrupt( digitalPinToInterrupt(interruptPin), trig_detected, RISING );

interruptPin 指定 Arduino 上接受中断的数字引脚,trig_detected 是处理中断的中断服务程序 (ISR),RISING 是触发中断的状态变化。

中断完成其功能后,可以使用以下方法将其关闭:

detachInterrupt(digitalPinToInterrupt(pin))

在这个项目中,由于我们使用方波触发中断,每次从低 (0V) 到高 (5V)(上升波形)的转换都会导致 trig_detected 启动。

这个项目的Arduino代码

他的代码使用了 Arduino 的 Fast X9CXXX 库。该库可在 GitHub 上找到:

https://github.com/GitMoDu/FastX9CXXX

在编译代码之前,请确保代码已下载并包含在您的 Arduino 库文件夹中。

该功能的整体流程在简介中进行了描述。

程序的设置部分使用 Arduino 的引脚 3、4 和 5 启动 X9C104 对象。电位器设置为 50 步(中途)。

主循环等待用户通过串口监视器输入;此输入必须是所需的频率。由于此项目的设计,输入频率可以在 80 Hz 和 550 Hz 之间,并作为单个数字输入(例如 80 或 550)。如果改变C、R1和R2的值,将产生不同的频率。

一些附加说明:

  • 代码中的中断服务程序(ISR)称为void trig_detected()。它返回从 micros() 派生的两个值,然后将这两个值相互相减以获得中断事件之间的持续时间。该持续时间是方波频率的倒数。
  • 方波持续时间的 12 个样本被获取并存储在一个数组 (trigArray) 中。计算最后 10 个的平均值。
  • 这些频率用于计算 ΔR 值,该值用于设置电位器值。
  • 执行两个调谐例程以使频率等于输入值。

最后的话

电路的频率测量是在各种输入值下进行的。结果列于下表:

 

pYYBAGPjIByAG5kfAABkOWHlHwA352.png
结果
 

当然,该电路存在固有的局限性。主要限制是电位器的步进性质。由于频率到电阻的方程式,单个电位器步进会导致较高频率下的宽频率跳变。

此外,在 ISR 中使用 micros() 可能无法在不同频率下工作。使用定时器寄存器可以解决这个问题。

但是一个具有多个应用程序的有趣项目。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.lene-v.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'带Arduino和X9C104数字控制电位器的伪锁相环',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.lene-v.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);