mtiaopi 发表于 2024-4-7 11:31:09

哪位老师帮忙解答下这个是什么意思

j = (u16)((duty*4096UL)/(PERIOD+1));    //计算ADC采样理论值

这里面的*4096UL代表什么意思

#define PERIOD          255L   //PWM周期

还有这个255L是多少

qq675032915 发表于 2024-4-7 11:42:58

UL表示unsigned long,L表示long
如果直接写4096会定义为int型,后面加上UL,就表示这个4096是unsigned long型的数据。
255L同理

mtiaopi 发表于 2024-4-7 12:16:50

qq675032915 发表于 2024-4-7 11:42
UL表示unsigned long,L表示long
如果直接写4096会定义为int型,后面加上UL,就表示这个4096是unsigned lon ...

这两个数没超出int型的范围,为什么要定义为长整形

jwd 发表于 2024-4-7 13:11:16

mtiaopi 发表于 2024-4-7 12:16
这两个数没超出int型的范围,为什么要定义为长整形

你可以定义成长整型啊,它支持

jwd 发表于 2024-4-7 13:11:43

jwd 发表于 2024-4-7 13:11
你可以定义成长整型啊,它支持

只是你用不用的问题

wangxiangtan 发表于 2024-4-7 13:35:14

keilc51使用的字节范围是
int 占两个字节 范围:-32768~+32767

long占四个字节 范围:-2147483648~+2147483647

为啥要用usigned long再强制转换回u16

mtiaopi 发表于 2024-4-7 13:43:11

wangxiangtan 发表于 2024-4-7 13:35
keilc51使用的字节范围是
int 占两个字节 范围:-32768~+32767



不知道,这个是屠龙刀核心板的例程里面的,就是不明白才来问下什么意思,原程序:
                cnt200ms = 0;
                adc = Get_ADC12bitResult(8);//参数0~15,查询方式做一次ADC, 返回值就是结果
                j = (u16)((duty*4096UL)/(PERIOD+1));    //计算ADC采样理论值
                if(j>adc)
                {
                  if(((j-adc)>THRESHOLD) && (feedback<=PERIOD)) feedback++;
                }
                else
                {
                  if(((adc-j)>THRESHOLD) && (feedback>0)) feedback--;
                }
                printf("ADC=%u,duty=%u,feedback=%u\r\n",adc,duty,feedback);
                UpdatePwm(feedback);    //更新占空比

嵌入式之路 发表于 2024-4-7 14:44:15

其实直接4096也行

21cnsound 发表于 2024-4-7 14:50:57

mtiaopi 发表于 2024-4-7 13:43
不知道,这个是屠龙刀核心板的例程里面的,就是不明白才来问下什么意思,原程序:
                cnt20 ...

duty*4096: 可能超过65535,所以强制为UL类型,不丢位。
(u16):最后的结果肯定是小于65535的,所以再强制转换回来。

从汇编过来的,之前看过好像是这样的

hbsuntt 发表于 2024-4-7 15:54:02

嵌入式之路 发表于 2024-4-7 14:44
其实直接4096也行

自己搞肯定就这样干了
页: [1] 2
查看完整版本: 哪位老师帮忙解答下这个是什么意思