目录
- 一、旋转变压器与DsAdc原理
- 1.常见电机角度反馈方式
- 2.可变磁阻旋变工作原理
- 3.使用TC3XX EDSADC进行旋变软解码
- 二、EB配置
- 1.载波输出
- 2.通道配置
- 3.调制器
- 4.滤波链路
- 5.整流
- 6.积分
- 三、Mcal接口应用
- 1.AUtosar标准API接口
- 2.应用步骤
- 四、总结
一、旋转变压器与DsAdc原理
1.常见电机角度反馈方式
-
旋转编码器: 类似发电机原理,通过机械转动产生角度信息,内部集成ECU,往往是通过通讯获取解算好的角度速度信息
-
**霍尔传感器:**由一个特制磁环与检测脉冲电路板构成,市面上常见的为AB相霍尔编码器,输出两路正交相位相差90度的脉冲波
-
旋转变压器: 旋变主要分为经典旋变与可变磁阻旋变,主要区别在于经典旋变是根据转子与定子的感应电压来确定角度;而,可变磁阻旋变转子上没有绕组,而是由特定的形状(如凸极)构成,这些凸极会改变气隙磁导,从而影响次级绕组的输出电压。初级和次级绕组都位于定子上。这种结构通过改变转子与定子之间的气隙磁阻来实现输出信号的变化 。
-
光电编码器、磁编码器、电阻式角度传感器等
2.可变磁阻旋变工作原理
- 旋变结构示意图: 图1说明了旋变的使用方式,输入频率周期都不变的正弦信号,将会得到相位相差90°的旋变信号,其中一个为sin一个为cos;图2图3说明了旋变在永磁同步电机上的应用方式,定子将会安装在壳体上,转子安装在电机输出轴上跟随电机转动;图4说明了旋变的内部构造,每个磁极上都绕有励磁信号,两组检测线圈按照互为90度的方式绕线,将旋变水平面划分为4个象限,当转子上的永磁体转动到不同位置时,检测线圈上检测到的信号幅值有所不同,两组检测线圈分别输出sin与cos信号,因为tanθ = sinθ/cosθ,只要得到tanθ的值取个反正切即可得到角度θ。这里θ是先对于零点而言的,即永磁体凸轮最高点位与sin线圈磁极对齐点。
图1
图2
图3
图4
3.使用TC3XX EDSADC进行旋变软解码
- 软解码处理思路: 1.提取外包络(极值法、积分法) 2.角度解算(反正切、观测器)3.时间补偿(控制周期与反馈周期不同步需要此步骤)
- 接口定义: TC3XX EDSadc提供了两路励磁接口PWMP、PWMN,可用于输出差分SIN信号以抑制共模干扰,当然使用一路旋变也是能正常工作的,另一端接地即可;四路旋变信号输入接口分别用于获取sin+、sin-、cos+、cos-旋变输出信号
- 解调的目的: 由于我们引入了激励信号去激励旋变从而获取角度信息,所以旋变输出的信号同时带有了激励信号与角度信息,输出的波形幅值即为角度信息;进而明确我们解调的目的,将旋变的输出信号中的激励信号去除只留下角度信息,即提取出旋变输出信号的外包络
解调的方式有两种:峰值提取、积分法
-
峰值提取法: 由于激励信号是由我们提供的,可以得到激励信号的峰值点,基于这个前提可以配置GTM触发evadc在峰值点进行采样,这样做的好处相对于积分法在于节省许多解算的时间
-
积分法: 其中关键步骤在于整型,其需要的符号在使用edsadc生成激励信号时就已经同步生成符号
- TC3XX EDSADC解调过程:
- 角度计算(反正切): Vb/Va = tanθ,对其做反正切即可获取到θ,实际工程应用中会将所有可能计算的反正切结果制作为表格查表使用节省资源,提高计算效率
- 时间补偿: 所谓的时间补偿其实并不是真正意义上使得控制周期与角度反馈周期一致,而是基于当前采样到的角度经过一系列参数调整估算出一个补偿控制周期与角度反馈周期时间差的角度状态,以便尽可能确保控制的同步性。以下为一种简单的角度跟随器算法:
#include <stdio.h>
#include <math.h>// 定义二阶跟随器的参数
#define SAMPLE_RATE 100.0 // 采样率(Hz),可以根据需要调整
#define DT (1.0 / SAMPLE_RATE) // 采样周期(秒)// 增益值,这些值需要根据系统的自然频率和阻尼比进行调整
// 在这里,我们假设一个较高的自然频率和较低的阻尼比以加快响应速度
#define K1 100.0 // 第一个积分器(或误差积分器)的增益
#define K2 27.0 // 第二个积分器(或输出积分器)的增益// 二阶跟随器的状态变量
double angle_input = 0.0; // 输入角度(弧度)
double angle_output = 0.0; // 输出角度(弧度)
double integrator1_state = 0.0; // 第一个积分器的状态
double integrator2_state = 0.0; // 第二个积分器的状态// 二阶角度跟随器的更新函数
void update_angle_tracker(double new_input) {// 更新第一个积分器(累积误差)integrator1_state += K1 * (new_input - angle_output) * DT;// 更新第二个积分器(产生输出)integrator2_state += K2 * integrator1_state * DT;// 更新输出角度angle_output = integrator2_state;
}int main() {// 示例输入数据(这里使用弧度表示的角度)double input_angles[] = {0.0, M_PI/180, 2*M_PI/180, 3*M_PI/180, 4*M_PI/180, 5*M_PI/180,4*M_PI/180, 3*M_PI/180, 2*M_PI/180, M_PI/180, 0.0};int num_samples = sizeof(input_angles) / sizeof(input_angles[0]);// 模拟时间步长for (int i = 0; i < num_samples; i++) {// 更新跟随器update_angle_tracker(input_angles[i]);// 打印当前输出角度(转换为度数以便更容易理解)printf("Input Angle (deg): %.2f, Output Angle (deg): %.2f\n",input_angles[i] * 180.0 / M_PI, angle_output * 180.0 / M_PI);// 在实际应用中,这里应该有一个延迟来模拟实际的采样周期// 但为了简化,这里省略了延迟}return 0;
}
经过一定的参数整定,可见结果具有一定的预测性。
二、EB配置
1.载波输出
- DsadcGlobalCfg: 通用配置
- DsadcCarrierGenCfg: dsadc输出载波配置,基于模块时钟进行分频,极性配置为normal则先输出高电平,载波生成模式设置为比特反向生成模式增加了频谱易产生更为平滑的正弦波。
2.通道配置
- 结果访问模式:
a. CIRCULAR_BUFFER:将结果缓存去设置为循环缓存区
b. DMA_ACCESS:结果必须由DMA传输
c. SINGLEREAD:读取硬件结果直接返回 - 触发模式:
a. MODE_NORMAL:调用Dsadc_StartModulation() API进行数据采集
b. MODE_WINDOW:在门控信号开启后进行采集(GTM、ERU) - 时间戳:
a.Trig配置为MODE_WINDOW:时间戳是最后一个HW结果到门控信号打开的时间计数
b.Trig配置为MODE_NORMAL:时间戳是从结果时间到调用Dsadc_ReadResult API获取到寄存器值的计数
3.调制器
- EB中配置项与TC3xx系列架构模块对应关系,可参考配置寄存器MODCFGx描述配置
- 细分配置项
4.滤波链路
- 备用服务请求:
a. COMPARATOR_EVENT:比较器事件
b. TIMESTAMP_EVENT:时间戳事件
c. RESOLVER_EVENT:备用源
5.整流
- 整流符号:
- SRC_0_ON_CHIP_CARRIER_GENERATOR:片上生成载波的时候同时生成了符号,来自于片上载波符号
- SRC_1_SIGNRESULT_FROM_DSADC_CHANNEL :来自于dsadc通道中的一个
- SRC_2_EXTERNAL_SIGN_SIGNAL_PORT_A :符号信号是由外部来源提供的 PortA
- SRC_3_EXTERNAL_SIGN_SIGNAL_PORT_B :符号信号是由外部来源提供的PortB
6.积分
- 该项配置位于调制器的细分配置下
三、Mcal接口应用
1.AUtosar标准API接口
接口名 | 传入参数 | 说明 | 返回参数 | 函数功能 |
---|---|---|---|---|
IrqDsadc_Init() | - | - | - | Dsadc中断初始化 |
Dsadc_Init() | Dsadc_ConfigType * ConfigPtr | ConfigPtr:Dsadc配置指针 | - | Dsadc初始化 |
Dsadc_StartCalibration() | Dsadc_ChannelType ChannelIdChannelId | ChannelIdChannelId:dsadc通道号 | Std_ReturnType:0:OK 1:NotOK | Dsadc校准 |
Dsadc_GetCalibrationStatus() | Dsadc_ChannelType ChannelIdChannelId | ChannelIdChannelId:dsadc通道号 | Std_ReturnType:0:OK 1:NotOK | 获取Dsadc校准状态 |
Dsadc_SetupResultBuffer() | Dsadc_ChannelType ChannelId, Dsadc_ResultType * DataBufferPtr, Dsadc_SizeType Size | ChannelId:Dsadc通道ID DataBufferPtr:数据缓存指针 Size缓存大小 | Std_ReturnType:0:OK 1:NotOK | Dsadc安装结果buffer |
Dsadc_StartModulation() | Dsadc_ChannelType ChannelId | ChannelId:Dsadc通道ID | Std_ReturnType:0:OK 1:NotOK | 启动调制器,结果采集、触发 |
Dsadc_StartCarrierSignal() | - | - | Std_ReturnType:0:OK 1:NotOK | 开始生成载波 |
Dsadc_ReadResult() | Dsadc_ChannelType ChannelId,Dsadc_ResultType * ResultPtr | ChannelId:Dsadc通道 ResultPtr:结果获取指针 | Std_ReturnType:0:OK 1:NotOK | 获取对应dsadc通道结果 |
2.应用步骤
- Dsadc初始化
Dsadc_Init(&Dsadc_Config);Dsadc_SetupResultBuffer(DsadcChannel_DsadcChannelConfiguration_0,Dsadc_BuffReturn,10);Dsadc_StartModulation(DsadcChannel_DsadcChannelConfiguration_0);Dsadc_StartCarrierSignal();
- 中断+Dsadc初始化
IrqDsadc_Init();SRC_DSADCSRM1.B.SRE = 1;Dsadc_Init(&Dsadc_Config);Dsadc_EnableNotifications(DsadcChannel_DsadcChannelConfiguration_0);Dsadc_SetupResultBuffer(DsadcChannel_DsadcChannelConfiguration_0,Dsadc_BuffReturn,10);Dsadc_StartModulation(DsadcChannel_DsadcChannelConfiguration_0);Dsadc_StartCarrierSignal();
- 中断+校准+Dsadc初始化
IrqDsadc_Init();SRC_DSADCSRM1.B.SRE = 1;Dsadc_Init(&Dsadc_Config);Dsadc_EnableNotifications(DsadcChannel_DsadcChannelConfiguration_0);Dsadc_StartCalibration(DsadcChannel_DsadcChannelConfiguration_0);Dsadc_CalibrationStatusReturn = Dsadc_GetCalibrationStatus(DsadcChannel_DsadcChannelConfiguration_0);Dsadc_SetupResultBuffer(DsadcChannel_DsadcChannelConfiguration_0,Dsadc_BuffReturn,10);Dsadc_StartModulation(DsadcChannel_DsadcChannelConfiguration_0);Dsadc_StartCarrierSignal();
- 获取结果
Dsadc_StateReturn = Dsadc_GetStatus(DsadcChannel_DsadcChannelConfiguration_0);
四、总结
本文为博主个人理解总结记录,如有不正,欢迎指正