k005 发表于 2012-12-6 10:59:11

float的AD值怎么转成long的PWM值

PIC12F1501单片机,CCS编译器。
read_adc()读出来是float,
set_pwm1_duty() 这边赋值需要long,
数据类型怎么转换????

尝试过强制转换duty = (long)ad;结果不行。
路过的大神请指点一二。

techbaby 发表于 2012-12-6 11:08:21

adc读出来的是float类型值,我out了!

kmani 发表于 2012-12-6 11:10:02

读出来的AD值先除以AD的最大值然后再乘以PWM的最大值,再四舍五入为整数,不知是这个意思不。

k005 发表于 2012-12-6 11:16:09

techbaby 发表于 2012-12-6 11:08 static/image/common/back.gif
adc读出来的是float类型值,我out了!

省时间,没说清楚。
ad = ((ad * REF ) / 1024)*2; 这不就是 float了?

techbaby 发表于 2012-12-6 11:45:55

k005 发表于 2012-12-6 11:16 static/image/common/back.gif
省时间,没说清楚。
ad = ((ad * REF ) / 1024)*2; 这不就是 float了?

ad和REF若都不是float类型,那么结果肯定不是float型。

k005 发表于 2012-12-6 11:51:14

techbaby 发表于 2012-12-6 11:45 static/image/common/back.gif
ad和REF若都不是float类型,那么结果肯定不是float型。

CCS编译器里面只要有小数的,都归到float。

ifuleu 发表于 2012-12-6 12:33:49

那就再×1024后再转换吧

yklstudent 发表于 2012-12-6 12:52:37

我被楼主折服了 float是从哪里来的呢

k005 发表于 2012-12-6 13:59:06

yklstudent 发表于 2012-12-6 12:52 static/image/common/back.gif
我被楼主折服了 float是从哪里来的呢

没错啊,又复习一遍数据类型。
AD转换后有小数,不是float? 是什么?

还有一个 发表于 2012-12-6 15:20:37

本帖最后由 还有一个 于 2012-12-6 15:42 编辑

乘出的结果直接右移9位行不行?

ourdevstm32 发表于 2012-12-6 15:24:19

无语,AD转换后的值肯定不会是float

xfdr 发表于 2012-12-6 23:36:56

10位AD是1024,12位是4096,是unsigned int型的呀,(float)adc_value*(5.0/1023)这样才是float型的。

k005 发表于 2012-12-7 07:59:39

xfdr 发表于 2012-12-6 23:36 static/image/common/back.gif
10位AD是1024,12位是4096,是unsigned int型的呀,(float)adc_value*(5.0/1023)这样才是float型的。 ...

LS都岔开主题了。
(float)adc_value*(5.0/1023)这样才是float型的
我的问题是:这边的float怎样转换成long,误差允许1%。
请各位不要再纠结AD的读数,请关注数据转换。

yklstudent 发表于 2012-12-7 08:02:50

就楼猪这态度 哎 难交流

sz2009 发表于 2012-12-7 20:38:50

楼主为什么不想办法让AD函数读出整型数,而舍近求远,求float 转整型。 众多网友都指出,AD函数应该读出整型,就楼主一人坚持读出是float型。

k005 发表于 2012-12-7 22:25:40

sz2009 发表于 2012-12-7 20:38 static/image/common/back.gif
楼主为什么不想办法让AD函数读出整型数,而舍近求远,求float 转整型。 众多网友都指出,AD函数应该读出整 ...

请看13L答复
另外问题已解决。

wangjiati 发表于 2012-12-8 08:40:13

CCS 编译器帮助文档中 搜索 "read_adc()"查看到" Returns:    Either a 8 or 16 bit int depending on #DEVICE ADC = directive"   
AD读出的值可以直接写入到PWM
set_pwm1_duty( read_adc() );
float 转 int小数转为整数.小数点后要吗?四舍五入?      假如是1.4转成整数 应该是1 还是 2?误差?% 这个只是相对.    解决这样的问题我们很多时候都会陷入死循环.所以避开.另寻出路

k005 发表于 2012-12-8 09:10:13

wangjiati 发表于 2012-12-8 08:40 static/image/common/back.gif
CCS 编译器帮助文档中 搜索 "read_adc()"查看到" Returns:    Either a 8 or 16 bit int depending on...

多谢,就采用的你的方式解决的。

Godynono 发表于 2012-12-28 15:50:42

直接把值给PWM不行么?
页: [1]
查看完整版本: float的AD值怎么转成long的PWM值