- 打卡等级:以坛为家II
- 打卡总天数:424
- 最近打卡:2025-05-02 14:37:11
已绑定手机
超级版主
DebugLab
- 积分
- 8382
|
发表于 2024-10-13 01:01:35
|
显示全部楼层
已知
甲:0000=0.0V=***A
乙:2048=2.5V=000A
丙:****=4.5V=200A
丁:4096=5.0V=***A
求
C语言程序,输入ADC值,输出电流
解
设ADC值为x,电流为y,该函数是二元一次方程
首先需要明确一些定律:
在笛卡尔坐标系中任何一个一次方程的图像都是直线
两点确定一条直线
直线的斜率△处处相等
先确定这两个点:
第一个点为最小值,取乙,为(2048,0A)
第二个点为最大值,取丁,x=4096,求y
使用乙、丙计算斜率,设电压为z,计算斜率△y/△z,该函数是一元一次方程
△y=200A-0A=200A
△z=4.5V-2.5V=2V
△y/△z=200A/2V
化简,得△y/△z=100A/V
计算丁的y
△y/△z=100A/V
(y-0)/(5.0V-2.5V)=100A/V
y/2.5V=100A/V
内项之积等于外项之积
y=2.5V*100A/1V
y=250A
第2个点就计算出来了,丁的坐标为(4096,250A)
计算斜率△y/△x
△y/△x=(250A-0A)/(4096-2048)
△y/△x=250A/2048
已知x,求y
(y-0A)/(x-2048)=250A/2048
y/(x-2048)=250A/2048
还是内项之积等于外项之积
y=(x-2048)*250A/2048
这就OK了
使用50%验证
(4096+2048)/2=3072
(250A+0A)/2=125A
应为(3072,125A)
y=(3072-2048)*250A/2048
y=1024*250A/2048
y=250A/2
y=125A
验证OK
编程
采用定点计算,电流分辨率设置为0.1A
unsigned int Calculate_Current(unsigned int x)
{
return (unsigned int)((unsigned long)x-2048UL)*2500UL/2048UL;
}
化简得
unsigned int Calculate_Current(unsigned int x)
{
return (unsigned int)((unsigned long)x-2048UL)*625UL/512UL;
}
输入参数为ADC值,返回值为电流(单位A)的10倍(0.1A)
|
|