完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
我对PIC单片机是新手。我已经熟悉这张照片大约3个月了。我确信我的错误来自于我对这些微控制器的缺乏经验和对它们的编码过程。我一直在学习这个微控制器的所有能力,但是我对PWM有问题。我在PWM上找到了这个代码。它设定占空比为68%,这似乎是可行的。我从RC5(PWM1)得到一个输出。我试图改变占空比,这是我遇到问题的地方。在数据表中,它表示“PWMxDCL和PWMxDCH寄存器配置占空比”,但是当我改变这两个电阻器的二进制时,输出不变。我也很困惑如何使用这8位二进制数来改变占空比。如果有人能解释这是怎么回事,那就太好了。我可以通过改变PR2定时器来改变输出。这是有意义的,因为我正在根据数据表“PWM周期由timer2的PR2寄存器指定”来更改周期。但是无论我把EXPREWMXDCL和PWMXDCH注册到什么,我都不能得到输出的改变。如果有人给我一个建议或解释,我会非常感激编译器:XC8(v1.44)MPLAB X v4.05PIC:PIC16LF1503PICKIT3
|
|
相关推荐
7个回答
|
|
|
假设我们有一个10位寄存器来决定占空比。叫它DCreg吧。没有实际的10位寄存器,但是我们可以在PIC中将10位值放入无符号整数变量中,所以可以这样计算:现在,实际的占空比取决于PR2和DCreg值。(注意,周期取决于PR2和定时器2的预缩放和后缩放值,但是占空比仅取决于PR2。)忽略编程方面的考虑,这里是DCreg:DCreg=RoundedValue_of(4*(PR2+1)*DutyCycleRatio)的计算。希望占空比为0.5:DCreg=RoundedValue_of(4*10*0.5)=20。DCreg计算的位分布在两个8位寄存器DCH和DCL上,如下所示:DCH=(DCreg>>2)&0xff.DCL=(DCreg<<6)&0xff。对于本例来说,对于DCreg=20,我们得到DCH=5(十进制)=0x05,DCL=0(十进制)=0x00以便确认,将这些值插入程序的PWM1DCH和PWM1DCL。我有一个占空比为0.5与我的PIC16F150 3。如果您没有获得预期的输出,请再次发布并显示整个程序。[/Begin Edit]请注意:在设置PWM之后,您的代码需要一段时间(1){}循环(或某些类似的循环),以便它保持在main()中。如果它“从页面的末尾跑出来”,即它从主()返回,CPU只是重置,所以你永远不会得到任何有用的东西。也许您在测试中得到了它,但是您没有显示给我们。[/End Edit]现在,公式的一些结果:对于给定的PR2,任何DCH值>=(PR2+1)*4给出占空比1.00,所以您的程序没有给出占空比值的输出。(请注意,由于您使PWMCONbits.POL=1,所以PWM周期从PWM低开始并在周期内变高,所以占空比是(1.0-公式值),所以除0.5之外的任何占空比都将是“向后”,即波形相对于公式的计算将是“颠倒”的)。现在,假设我们想要一个特定的占空比值。我们如何计算DCH和DCL?让我们举个例子:假设我们想要0.68的占空比,不想做浮点运算,让我们通过将0.68表示为68/100来保持其为整数。(所以68是常用的“占空比”而不是“占空比”。)然后,尽可能接近整数结果。DCreg=RoundedValue_of((4*(PR2+1)*68)/100)DCreg=RoundedValue_of(27.2)=27。ff=0xC0要得到四舍五入的无符号整数结果,在执行除法之前,将一半的分母添加到分子中:DCreg=(4*(PR2+1)*68+50)/100(我们正在进行整数除法的地方)DCreg=27用于测试目的,可以为%占空比给出一个整数值,并使用该值wh在公式中出现“68”。一般来说,你必须确保计算不会溢出。使用32位的算术是安全的。注意实际的占空比是27/40=0.675,这与PR2=9时的0.68非常接近。PR2的高值将允许占空比值的更细粒度。(但是,当然,PR2决定频率,所以我们并不总是自由选择和选择。)最后,这里有一个值表(对于PR2=9),因为DCreg值从0到40:PIC16F1503 PWM占空比,PR2=9=0x09DC占空比:DCL占空比(十进制)(十六进制)%--------------------------------------------------------------------------------------------------------------------------------------------------------------0:00:00:00:00.000 1 00:40 2.500 2 00:80 5.000 3 00:C0 7.500 4 01:00 10.000 5 01:40 12.500 6 01:80 15.000 7 01:C0 17.500 8 02:00 20.000 9 02:40 22.500 10 02:80 25.000 11 02:C0 27.500 12 03:00 13 03:00 32.500 14 03:80 35.500 14 03:80 35.000 15 03:C0 37.500 16 04:00 17.500 18 04:40 45.000 19:04:00C0 47.500 20 05:00 50.000 21 05:40 52.500 22 05:80 55.000 23 05:C0 57.500 24 06:00 60.000 25 06:40 62.500 26 06:80 65.000 27 06:C0 67.500 28 07:40 72.500 30 07:80 75.500 30 30 07:C0 77.500 32 08:00 80 80 80 80.000 33 08:80 82.500 34 08:80 85.000 35 08:C0 87.500 36 09:00 90.000 37 09:40 92.500 3.5008 09:80 95 95 39 09:C0 97.500 40 0A:00 100.000,戴夫
|
|
|
|
|
|
谢谢戴夫!!!!这是非常有用的,但我仍然迷失在一点上。在上面的帖子“对于这个例子,使用DCreg=20,我们得到DCH=5(十进制)=0x05,而DCL=0(十进制)=0x00”中陈述了这一点,我理解如何得到20,但是我仍然不确定如何得到5的DCH和0的DCL。这部分没有工作,你似乎是从常识中知道这一点的??
|
|
|
|
|
|
由于较低的2位在DCL中,移位DCREG值右2位,在DCL中放置低2位,在DCH中放置8位。右移2位与除以4(2×2)相同,所以20/4=5进入DCH,20% 4=0进入DCL的上2位。
|
|
|
|
|
|
嗯,有一些“工作”。我展示了我可能会在程序中使用的计算:[编辑]在示例[/编辑]中有些令人遗憾的拼写错误,实际上,我使用我编写的程序创建了表。我将在一分钟内对另一个DCreg值重复这个步骤。但是,首先……让我们“手动”进行操作,假设您知道如何将十进制数转换为二进制数:例如,假设DCreg=29十进制。你的问题是关于我使用20的例子,但是我在这里使用29,只是为了显示一些不同的东西。对于DCreg=29,表显示了十六进制值DCH:DCL=07:C0。即:DCH=0x07和DCL=0x40Ge铅笔(或钢笔)和纸张。在概念上,我将展示如何使用数据表中的描述来达到这些值。你可以听从我的叙述,但我坚信积极地重建这些步骤。(但是我也理解不同的人有不同的学习方法,就像不同的人有不同的尝试帮助的方法一样。)无论如何……把值写成二进制数:29(十进制)=1101(二进制)。与二进制值相对应的位。在8个最高有效位下面写一个“H”,在两个最低有效位下面写一个“L”:0 0 0 0 0 1 0 1H H H H H H H L,这个10位数字的最高有效8位进入DCH。在表格中,我用十六进制表示值:DCH=0 0 0 0 1 1(二进制)=0 x07十六进制。现在,生成一个8位二进制数,其中两个最高有效位等于DCreg的“L”位,而其他位等于0:0 1 0 0 0 0 0 0 L LThis就是进入DCL:DCL=0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 000(二进制)=0x40十六进制。现在,用值等于16位无符号整数29十进制(上位简单地为零)的DCRG以编程方式执行此操作。我已经重复了“H”和“L”的内容来提醒我,关于PCM占空比这里什么是有意义的:DCreg=0 0 0 0 0 0 0 0 0 0 0 1 0 1H H H H H H L LDCH等于将DCreg值向右移动2位的8位截断结果:DCH=0 0 0 0 0 0 0 1 1 1 = 0x07DCH等于将DCreg值向左移动6位的8位截断结果(在完成移位时,零进入下位):DCL=0 1 0 0 0 0=0x40底线:Taa-daa!问候,戴夫
|
|
|
|
|
|
谢谢戴夫。到目前为止你一直很乐于助人,但我还有一个问题要问你。我发现MPLAB生成的代码有助于良好的编码实践和熟悉PIC编程。我已经生成了PWM的代码,我可以通过调用“pWM1LoAdutyValueUE())来加载PWM。我首先调用PWM1_LoadDutyValue(1023);然后使用“u._ms(250);”设置延迟,然后调用“PWM1_LoadDutyValue(511);”我希望程序将输出电压设置为3.3V,延迟,然后将电压减半到1.65V左右。“电压是3.16V,但是程序只停留在这个电压,不会改变电压。我认为这种拖延是有问题的。这就像它不是步进,虽然MPlab没有一个步骤,虽然代码命令。我可以整天改变第一个“PWM1_LoadDutyValue():”,电压将会改变,但是它不会延迟并将电压改变为值的一半。你有什么解决办法吗?我已经在TXT文档中附加了生成的文件。我的主要代码如下
Timer2.txt(2.96KB)-下载70次PWM.txt(2.52KB)-下载76次Pin.txt(2.54KB)-下载55次MCC Config.txt(3.49KB)-下载67次 |
|
|
|
|
|
我没仔细看过你代码的其余部分,但是想想我在添加的行的注释中所说的话。在第二个延迟中,我希望平均值在250ms时是最大的,然后在250ms时是半的,然后永远重复这个序列。(假设您已经设置了所有其他的值以便能够使用这些占空比寄存器的值。)也就是说:对于PR2=0xFF,1023导致占空比=99.902%,511导致49.902%。
|
|
|
|
|
|
戴夫,我现在觉得问这个问题真傻。哈哈,我早就看过了。谢谢,今天我会尝试
|
|
|
|
|
只有小组成员才能发言,加入小组>>
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
475 浏览 0 评论
5794 浏览 9 评论
2334 浏览 8 评论
2224 浏览 10 评论
请问是否能把一个ADC值转换成两个字节用来设置PWM占空比?
3530 浏览 3 评论
1125浏览 1评论
有偿咨询,关于MPLAB X IPE烧录PIC32MX所遇到的问题
1098浏览 1评论
我是Microchip 的代理商,有PIC16F1829T-I/SS 技术问题可以咨询我,微信:A-chip-Ti
873浏览 1评论
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
475浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 16:20 , Processed in 0.967049 second(s), Total 85, Slave 69 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
7255