| 
				打卡等级:以坛为家III打卡总天数:600最近打卡:2025-10-31 06:34:52  已绑定手机超级版主 
 
	积分12070 
 | 
 
 发表于 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)
 
 | 
 |