This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具/软件:Code Composer Studio
尊敬的所有人:
我正在为两个电机开发速度控制。 我将 LAUNCHXL-f28069m 与两个 BOOSTXL-DRV8305EVM 搭配使用。 我使用的程序是 motorware 的 proj_lab06e。
目标是通过模拟输入电压0–3.3V 在外部调节速度。 最大 速度为5krpm。
在源代码“proj_lab06e”中,提供了几个函数。
程序代码摘录:
(使用此代码、我得到的分辨率为1krpm。 即、我只有5种速度:1krpm、2krpm、3krpm、4krpm 和5krpm。)
值=(_IQ) ADC_readResult (obj->adcHandle、ADC_ResultNumber_14); //读取 ADC 设置值
pAdcData->DCBus =值;//保存 ADC 值
值=_IQmpy (gAdcData[HAL_MTR2].DCBus、_IQ (0.0012820512820513)); //最大值 速度= 5krpm、最大 ADC 值3900 -> 5/3900 = 0.00128205...
gMotorVars[HAL_MTR1].SpeedRef_KRPM =_IQ (值);
使用另一个代码脚本可以获得40rpm 的分辨率。 但该分辨率也太低。 (但我认为这不是正确的表示法)
值=(_IQ) ADC_readResult (obj->adcHandle、ADC_ResultNumber_14);
refvalue =_IQmpy (value、_IQ (8));
pAdcData->DCBus =_IQmpy (refvalue、_IQ (0.004));
refValue =_IQmpy (_IQ (1)、gAdcData[HAL_MTR2].DCBus);
gMotorVars[HAL_MTR1].SpeedRef_krpm =_IQmpy (_IQ (refValue)、gSpeed_Hz_TO_krpm_SF[HAL_MTR1]*1.31);
gMotorVars[HAL_MTR1].SpeedRef_KRPM =计算值;
我知道“值”是一种_IQ 类型,范围为127.999。 -128、分辨率约为0.000 000 060。
但我的怀疑是,我只能计算“整数”:
127 = 5krpm
126 = 4.96krpm
125 = 4.92krpm
因为我无法实现例如125.5 = 4.941krpm。 我出了什么问题?
要获得更高的分辨率(例如5rpm)、我需要做什么? 您能给我一个解决这个问题的建议吗?
我完全使用 proj_lab06e、基本上我更改了:
proj_lab06e.c >第713–749行
hal_2mtr.h >第681–710行
文件已附加。
此外、电机是我自己的电机-没有标准电机。 实际上连接了两个电机。 只会观察/测量一个电机、另一个电机获得与观察到的电机相同的参数和值。 因此、这很好。
提前感谢大家。
感谢您的回复、我认为您是对的。 我还有一些问题:
假设 ADC 读取的输入电压为3.0V、相应的 ADC 值为4095。 我指定5krpm 的速度具有最大值 ADC 值4095。
如果输入电压为2.3V、则 ADC 值为3140、对应的速度为3.833krpm。 在此假设中、我附加了一个 Excel 表。
此外、我还有关于 uint16到_iq 数据转换的问题。 在文件“hal_2mtr.h”中,它被写入:
//转换电流 A
值=(_IQ) ADC_readResult (obj->adcHandle、ADC_ResultNumber_1);
值=_IQ12mpy (值、CURRENT_SF);
pAdcData->I.value[0]=值;
此代码由 lab06e 的编程器编写。
•我认为应该可以将 uint16值处理为_iQ24值。
•我还认为 uint16值具有非常好的分辨率。 它的变化率仅为每 mV 1-2rpm。 请参阅随附的 Excel 表格。
但是、要根据输入电压获取速度、该值应转换为_IQ24。 我现在的问题是、我该怎么做?
我的假设:
我的输入电压为2.3V。 ADC 值为3140 (十进制)-> uint16 = 0000 1100 0100 0100 (二进制)
由于上面的代码段、应该可以将 uint16转换为_iQ24。
现在_iQ24的值是:000 0000.0000 0000 1100 0100 0100。
但不幸的是,这不能按计划工作。 我做了什么错误或推理有什么错误?
非常感谢你的帮助。