查看: 4866|回复: 15

[其他] 关于学习“ADC PingPang”模式遇到的问题去、

[复制链接]

该用户从未签到

32

主题

138

帖子

0

中级会员

Rank: 3Rank: 3

积分
390
最后登录
2017-12-29
发表于 2017-4-1 10:53:15 | 显示全部楼层 |阅读模式
源码见该贴:https://www.nxpic.org.cn/module/foru ... 0%E4%BE%8B%E7%A8%8B

问题描述:
1、如图1所示,TPM1的不同通道的中断(2)和TPM1的中断(3)的区别是什么?
2、如图2所示,TPM1的Channel 0 和Channel 1的两个Channel Value Reg的值设置的不同?为什么?
Channel Value Reg难道不是计数的值吗?


图1

图1

图2

图2

3、上述源码程序我运行的结果和他原先的文档中的并不一致,他原先的结果见图3,我运行的结果见图四(明显错误),这是为何?

图3

图3
Pingpang Result.jpg






最佳答案

胡孟龙 发表于 2017-4-6 16:32 GG前辈:这个你回答好像有些问题,main.c里面根本没有啊。又找了好久的参考手册,发现了这个图: 手册上不是写着CH0F对应A,CH1F对应B,所以不管两者哪一个置位都会触发ADC 采样工作 ...
回复

使用道具 举报

该用户从未签到

723

主题

6382

帖子

0

超级版主

Rank: 8Rank: 8

积分
25450
最后登录
2025-9-4
发表于 2017-4-5 10:31:14 | 显示全部楼层
胡孟龙 发表于 2017-4-1 17:28
4、如图所述TPM1的CH0F、CH1F触发了ADC的采样,但是我完全不明白程序或者PE配置如何做到这一点的?

4、如图所述TPM1的CH0F、CH1F触发了ADC的采样,但是我完全不明白程序或者PE配置如何做到这一点的?
答:你可以看看,在对应的TPM 通道中断中,有开始对应的ADC模块采样,这个是通过代码实现的,不是完全通过PE的模块去实现的,建议你多看看代码内容,main.c中的。
回复 支持 0 反对 1

使用道具 举报

该用户从未签到

32

主题

138

帖子

0

中级会员

Rank: 3Rank: 3

积分
390
最后登录
2017-12-29
 楼主| 发表于 2017-4-1 17:28:12 | 显示全部楼层
4、如图所述TPM1的CH0F、CH1F触发了ADC的采样,但是我完全不明白程序或者PE配置如何做到这一点的? TPM1触发ADC.jpg


回复 支持 反对

使用道具 举报

该用户从未签到

32

主题

138

帖子

0

中级会员

Rank: 3Rank: 3

积分
390
最后登录
2017-12-29
 楼主| 发表于 2017-4-5 09:25:36 | 显示全部楼层
知道你们已经上班了,所以我又来顶我的帖子。
各位大神不要心烦,耐心帮忙解决啊!
谢谢!
回复 支持 反对

使用道具 举报

该用户从未签到

723

主题

6382

帖子

0

超级版主

Rank: 8Rank: 8

积分
25450
最后登录
2025-9-4
发表于 2017-4-5 10:27:08 | 显示全部楼层
楼主你好!
先单个回答你的问题吧:
问题1.问题2其实都是TPM的问题,建议你先看看参考手册中TPM的章节,通道和TPM counter计数的概念。
1、如图1所示,TPM1的不同通道的中断(2)和TPM1的中断(3)的区别是什么?
答: 2是通道中断,如果计数达到通道值,会产生一个通道匹配中断。 3是TPM的counter计数,如果counter计数满了,对应的TPM溢出中断标志会置位,产生中断。
2、如图2所示,TPM1的Channel 0 和Channel 1的两个Channel Value Reg的值设置的不同?为什么?
Channel Value Reg难道不是计数的值吗?
答:单个TPM有一个counter,但是有多个通道,这个就是为什么不同通道可以产生不同PWM占空比的原因。
  那么怎么在不同的通道中产生不同PWM占空比呢?就是通过的通道值去实现的。通道值不是TPM的计数值,计数值是TPM模块的,通道值是用来和TPM counter值去对比的,TPM计数值一旦到了对应的通道值,就会产生对应的通道中断,并且拉高拉低对应的引脚。

回复 支持 反对

使用道具 举报

该用户从未签到

723

主题

6382

帖子

0

超级版主

Rank: 8Rank: 8

积分
25450
最后登录
2025-9-4
发表于 2017-4-5 10:29:51 | 显示全部楼层
3、上述源码程序我运行的结果和他原先的文档中的并不一致,他原先的结果见图3,我运行的结果见图四(明显错误),这是为何?
答:你用的板子也是文档中的FRDM-KL25板子吗?还是自己的板子?
     文档中是用到了内部的温度传感器,是通过ADC去读取的,那么ADC的参考电压, VDDA等,你都得稳定,这样才能保证ADC模块的准确工作。
    另外就是输出的结果如果有差异,也和温度有关,不过的的值偏差太大,不知道你用的什么板子,建议你使用文档中的板子测试。

回复 支持 反对

使用道具 举报

该用户从未签到

32

主题

138

帖子

0

中级会员

Rank: 3Rank: 3

积分
390
最后登录
2017-12-29
 楼主| 发表于 2017-4-5 11:27:27 | 显示全部楼层
小恩GG 发表于 2017-4-5 10:29
3、上述源码程序我运行的结果和他原先的文档中的并不一致,他原先的结果见图3,我运行的结果见图四(明显错 ...

GG,我已经找到问题了,他的源码存在一个错误,ADC转换后得到的是数值,这个数字需要转换成电压值才能去计算温度。
所以错在源码。GG可以把那个链接更正下,免得影响更多人的学习使用。
如果需要,我可以把修改后的源码发给你。
回复 支持 反对

使用道具 举报

该用户从未签到

723

主题

6382

帖子

0

超级版主

Rank: 8Rank: 8

积分
25450
最后登录
2025-9-4
发表于 2017-4-5 12:44:49 | 显示全部楼层
胡孟龙 发表于 2017-4-5 11:27
GG,我已经找到问题了,他的源码存在一个错误,ADC转换后得到的是数值,这个数字需要转换成电压值才能去 ...

你可以把错误的地方以及你修改后的代码贴出来,我先看看。
回复 支持 反对

使用道具 举报

该用户从未签到

32

主题

138

帖子

0

中级会员

Rank: 3Rank: 3

积分
390
最后登录
2017-12-29
 楼主| 发表于 2017-4-5 14:01:14 | 显示全部楼层
小恩GG 发表于 2017-4-5 12:44
你可以把错误的地方以及你修改后的代码贴出来,我先看看。

源程序:
float ADC_Calculate(uint16 result_A,uint16 result_B)
{
float Vdd_Cal,ADCR_Temp25,ADCR_100m;
float i;
float Temp;
Vdd_Cal=655350/result_A;
ADCR_Temp25=471197/Vdd_Cal;//ADCR_Temp25=result_A*0.719
ADCR_100m=112393/Vdd_Cal;//ADCR_100m=result_A*0.171
Temp=(float)((result_B-ADCR_Temp25)*100/ADCR_100m);
i=(float)(25-Temp);
return (uint16)i;
}
温度计算:
温度计算.jpg
至于怎么修改?你看看吧


回复 支持 反对

使用道具 举报

该用户从未签到

723

主题

6382

帖子

0

超级版主

Rank: 8Rank: 8

积分
25450
最后登录
2025-9-4
发表于 2017-4-5 16:07:32 | 显示全部楼层
胡孟龙 发表于 2017-4-5 14:01
源程序:
float ADC_Calculate(uint16 result_A,uint16 result_B)
{

你测一下板子上的VDD是多少吗?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-9-6 20:45 , Processed in 0.112840 second(s), 33 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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