系列文章目录
等待更新中…
文章目录
前言:
看懂此章,阁下已经跨入炼气期第五层了(滑稽)
1、什么是ADC的结果访问
在Autosar标准中,我们使用标准函数Adc_GetStreamLastPointer与Adc_ReadGroup对AD转换结果进行取值;那么这二者之间有何异同呢
2、ADC访问模式:
1、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地址开始的通道值。组信道值按信道号升序存储(与配置流访问时结果缓冲区的存储布局相反)。
3、Adc_GetStreamLastPointer与Adc_ReadGroup比较:
共同点:
1、函数都将读取请求组的最新可用转换结果;
2、第一个入参相同,都是GroupID
不同点:
- 、结果缓冲区的存储布局相反,Adc_ReadGroup的最新转化结果放在下面;而Adc_GetStreamLastPointer的最新转化结果放在上面;
- 、第二个入参不同: Adc_GetStreamLastPointer的第二个参数类型PtrToSamplePtr为二级指针,Adc_ReadGroup的第二个参数DataBufferPtr类型为一级指针;
- 、需要的结果缓冲区的大小不同:Adc_GetStreamLastPointer采集的有效值的数量为Group中设置的通道数量×设置的AdcStreamingNumSamples(采样数)
例如:配置了2个通道,设置的采样数为3;那么结果缓冲区的大小至少要能接收超过六个数据,你设置的数组大小必须大于等于6; - 、返回值不同: Adc_GetStreamLastPointer返回每个通道的有效样本数量,存储在结果缓冲区中。
Adc_ReadGroup返回E_OK(结果可用,并写入数据缓冲区)、E_NOT_OK(没有可用的结果或发生了开发错误)
4、 运用实例:
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);