AutoSar标准下ADC的结果访问(Adc_ReadGroup与Adc_GetStreamLastPointer)的异同

目录

1、什么是ADC的结果访问

2、ADC访问模式:

 2.1 AdcGroupAccessMode----- ADC的Group的访问模式

3、AUTOSAR标准配置案例分析

3.1 Configuration

3.2 图形展示结果指针初始化

3.3 使用Adc_GetStreamLastPointer API访问结果:

3.4 使用Adc_ReadGroup API访问结果:

4、Adc_GetStreamLastPointer与Adc_ReadGroup比较:

共同点:

不同点:

应用实例


1、什么是ADC的结果访问


在Autosar标准中,我们使用标准函数Adc_GetStreamLastPointer与Adc_ReadGroup对AD转换结果进行取值;那么这二者之间有何异同呢

2、ADC访问模式:


 2.1 AdcGroupAccessMode----- ADC的Group的访问模式


在ONE-SHOT的转化模式下:
软件触发只能选择SINGLE-ACCESS(单次访问模式)
硬件触发可以选择SINGLE-ACCEESS 或者 STREAMING-ACCESS(线性流访问模式)

3、AUTOSAR标准配置案例分析

配置案例:(来源Autosr标准4.2.2;搞autosar的不看标准文档等于少条腿;网上博主写的文章大家也都是基于标准来写的)

3.1 Configuration

group G1中配置两个通道 CH0,CH1 结果指针指向G1_ResultPtr
group G2中配置1个通道 CH2 结果指针指向G2_ResultPtr
group G3中配置1个通道 CH3 结果指针指向G3_ResultPtr

group G1配置为STREAMING模式 AdcStreamingNumSamples(采样数)为3
group G2配置为STREAMING模式 AdcStreamingNumSamples(采样数)为2
group G1配置为SINGLE模式 此时AdcStreamingNumSamples(采样数)为1
NOTE: SINGLE模式相当于配置STREAMING模式时,把AdcStreamingNumSamples设置为1;

3.2 图形展示结果指针初始化


具体表现:
根据下图可以看出:
G1设置了采样数为3,所以在result buffer中,对同一个通道CH0有三个结果;
G2设置了采样数为2,所以在result buffer中,对同一个通道CH0有两个结果;
G2设置为了SINGLE模式(即采样数为1),所以在result buffer中,对同一个通道CH0有一个结果;

3.3 使用Adc_GetStreamLastPointer API访问结果:

Adc_GetStreamLastPointer(Adc_GroupType Group,Adc_ValueGroupType** Ptr To SamplePtr)

Fuc:返回每个通道的有效样本数量,存储在结果缓冲区中。
读取一个指针,指向组结果缓冲区中的某个位置。通过指针位置,可以访问最后一次完成转换轮的所有组通道的结果;(指向的都是最上层的结果,说明这个result buffer应该是一个栈的结构)

3.4 使用Adc_ReadGroup API访问结果:

Std_ReturnType Adc_ReadGroup(Adc_GroupType Group,Adc_ValueGroupType* DataBufferPtr)
调用Adc_ReadGroup将结果从结果缓冲区 -复制*到可选的读缓冲区

读取所请求组的最后一轮完成转换的组转换结果,并存储从DataBufferPtr地址开始的通道值。组信道值按信道号升序存储(与配置流访问时结果缓冲区的存储布局相反)。

4、Adc_GetStreamLastPointer与Adc_ReadGroup比较:

共同点:

1、函数都将读取请求组的最新可用转换结果;
2、第一个入参相同,都是GroupID

不同点:

  1. 结果缓冲区的存储布局相反,Adc_ReadGroup的最新转化结果放在下面;而Adc_GetStreamLastPointer的最新转化结果放在上面;
  2. 第二个入参不同: Adc_GetStreamLastPointer的第二个参数类型PtrToSamplePtr为二级指针,Adc_ReadGroup的第二个参数DataBufferPtr类型为一级指针;
  3. 需要的结果缓冲区的大小不同:Adc_GetStreamLastPointer采集的有效值的数量为Group中设置的通道数量×设置的AdcStreamingNumSamples(采样数)
  4. 例如:配置了2个通道,设置的采样数为3;那么结果缓冲区的大小至少要能接收超过六个数据,你设置的数组大小必须大于等于6;
  5. 返回值不同: Adc_GetStreamLastPointer返回每个通道的有效样本数量,存储在结果缓冲区中。
  6. Adc_ReadGroup返回E_OK(结果可用,并写入数据缓冲区)、E_NOT_OK(没有可用的结果或发生了开发错误)

应用实例

Adc_GetStreamLastPointer :

uint32 Sample_Num;
uint16 *ResultPtr;
uint16 Adc_Result_array[16];
uint8 status;

Adc_Init(&Adc_ConfigSet);
status = Adc_SetupResultBuffer(Group_0, Adc_Result_array);
if(status == E_OK)
{
Adc_StartGroupConversion(Group_0);
do
{
Sample_Num = Adc_GetStreamLastPointer(Group_0, &ResultPtr);
}while(Sample_Num == 0);
printf("%d\n", ResultPtr[0]);
}else
{
printf("setup result buffer fail");
}
Adc_StopGroupConversion(Group_0);

<think>好的,我现在需要帮助用户了解Adc_ReadGroup函数的用法。首先,我得仔细看看用户提供的引用内容,特别是引用[2]和引用[3],因为它们提到了Adc_ReadGroup和相关函数。 用户的问题是关于Adc_ReadGroup的使用说明或示例代码。根据引用[2],Adc_ReadGroup的参数是Adc_GroupType和Adc_ValueGroupType指针,返回类型是Std_ReturnType。看起来这个函数用于读取ADC转换后的数据。 接下来,我需要确定函数的具体功能。通常,ADC模块中的ReadGroup函数是用来获取某组ADC转换的结果。参数中的Group指定了哪个ADC组,pDataBufferPtr是存储数据的缓冲区指针。返回值可能表示操作是否成功,比如E_OK或E_NOT_OK。 然后,用户可能需要示例代码。根据引用[1]中的Adc_Notification示例,可以推断出代码结构。假设需要先启用通知,然后启动转换,最后读取数据。例如,初始化ADC组,启动转换,等待完成(可能通过通知机制),然后调用Adc_ReadGroup获取数据。 还要注意错误处理。引用[3]提到开发错误检测,比如无效的Group参数或未初始化模块的情况。在示例代码中,应该检查返回值是否为E_OK,以确认读取是否成功。 可能用户还需要知道如何配置ADC组,包括通道、转换模式等,但引用中没有详细说明。所以需要建议用户查阅具体模块的配置文档,或参考引用[4]中的状态图。 最后,生成相关问题时要考虑用户可能的后续疑问,比如错误处理、配置方法、其他函数的关系等。</think>### Adc_ReadGroup 函数使用说明 根据AUTOSAR标准中的ADC模块规范,`Adc_ReadGroup`函数用于读取指定ADC通道组的转换结果数据[^2]。其原型定义为: $$Std\_ReturnType \ Adc\_ReadGroup(Adc\_GroupType \ Group, \ Adc\_ValueGroupType* \ pDataBufferPtr);$$ #### 参数说明 | 参数 | 类型 | 说明 | |------|------|------| | Group | Adc_GroupType | ADC通道组标识符(需在配置中预定义)| | pDataBufferPtr | Adc_ValueGroupType* | 存储转换结果的缓冲区指针| #### 返回值 - `E_OK`: 数据读取成功 - `E_NOT_OK`: 读取失败(无效参数/未初始化/硬件错误) #### 使用步骤 1. 配置ADC组:在MCAL配置工具中定义ADC组的转换模式(单次/连续)、采样通道等参数[^4] 2. 启动转换:调用`Adc_StartGroupConversion(Group)` 3. 等待转换完成:通过`Adc_GetGroupStatus`或`Adc_Notification`回调[^1][^3] 4. 读取数据:使用本函数获取结果 #### 示例代码 ```c Adc_ValueGroupType adcResultBuffer; Std_ReturnType ret; /* 初始化ADC模块 */ Adc_Init(&Adc_Config); /* 启动组0转换 */ Adc_StartGroupConversion(ADC_GROUP_0); /* 等待转换完成(实际应使用中断/通知机制) */ while(Adc_GetGroupStatus(ADC_GROUP_0) != ADC_CONVERSION_COMPLETED); /* 读取转换结果 */ ret = Adc_ReadGroup(ADC_GROUP_0, &adcResultBuffer); if(ret == E_OK) { /* 处理adcResultBuffer中的12位ADC值 */ } else { /* 错误处理 */ } ``` #### 注意事项 1. 必须保证ADC模块已初始化 2. 缓冲区大小需匹配ADC组配置的通道数量 3. 连续转换模式下需要周期性读取数据 4. 开发阶段应启用错误检测机制[^3]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值