TC397 使用 EB 配置ADC-软件触发

1. 工具说明

MCU:TC397

EB: 26.2.0 (AS440)

2. 目标

使用AN17/P40.10做为ADC 检测电压。

关于ADC的知识,网上有很多也很详细,我这里就不做多余的说明。

对于这款MCU,官方给提供了EB工具可以配置ADC模块,减少了对ADC驱动的编写。触发方式有软件和硬件两种,这里先介绍软件触发。如有问题,可以一起讨论。

3.EB配置

3.1 时钟使用默认的160M

     Mcu->McuClockSettingConfig_0

3.2 ADC模块

可以参考如下配置

下面就是ADC硬件单元了,这里的硬件单元可以添加很多组,我这里只用一组做试验使用,具体使用哪组,可以看AN17对应哪路ADC group 。
下图datasheet里显示AN17是group 2,所以在AdcHwUnitId  里选择HWUNIT_ADC2。

3.2.1 Adc->AdcHwUnit_0
使用默认配置就可以了

AdcClockSource(ADC时钟源) :系统时钟

AdcPrescale(选择分频系数): 160/(7+1)
160:上面MCU给ADC的时钟频率

AdcHwUnitInputClass:

AdcChannel:
每组ADC里有很多通道,通过AdcAnChannelNum  来区分。这里只配置一个AN17来做试验。

AdcAnChannelNum 的选择按照下图的datasheet来,group 2 channel 1

3.2.2 Adc->AdcHwUnit_0->AdcHWGroup
AdcGroupAccessMode  : ADC_ACCESS_MODE_SINGLE(单个访问模式)
AdcGroupConversionMode  :ADC_CONV_MODE_ONESHOT(触发后进行一次通道组转换)
AdcGroupTriggSrc  :ADC_TRIGG_SRC_SW(软件触发)
AdcStreamingBufferMode  : ADC_STREAM_BUFFER_LINEAR(一旦达到采样数,ADC驱动就停止转换)

配置中断回调函数,完成一次转换调用一次。

定义一组里有哪些通道,我这里只使用了一个通道。

参数结果配置寄存器,存储ADC转换的结果。参数的值按照升序排列。

3.3 IRQ中断配置

 Irq->IrqAdcConfig_0

3.4 ResourceM

4. 代码示例

首先需要把 Adc_Irq.c拷贝到自己的工程中。

初始化代码:

#include "Irq.h"
#include "Adc.h"


#define SRE_ENABLE (1<<10)

Adc_ValueGroupType Data_Buffer[10];

//回调函数
void IoHwAb_AdcNotification64(void)
{
  
}

void Adc_SWGroup(void)//ADC SW convert
{

    Std_ReturnType lRetVal;

    lRetVal = Adc_SetupResultBuffer(AdcConf_AdcGroup_AdcHWGroup, Data_Buffer);

    if(lRetVal != E_NOT_OK)
    {
        Adc_EnableGroupNotification(AdcConf_AdcGroup_AdcHWGroup);
        Adc_StartGroupConversion(AdcConf_AdcGroup_AdcHWGroup);
    }


}

void BSW_ADC_Init(void)
{
    
    const Adc_ConfigType * ConfigPtr = NULL_PTR;
    ConfigPtr = &Adc_Config;
    /* ADC Initialization */
    Adc_Init(ConfigPtr);
    /* ADC Startup Calibration */
    Adc_TriggerStartupCal();
    /* Wait till the Start Calibration is over*/
    while(Adc_GetStartupCalStatus() != ADC_STARTUP_CALIB_OVER);
    /* Initialize the SRPN and TOS for used interrupts */
    IrqAdc_Init();

    SRC_VADCG2SR0.U |= SRE_ENABLE;
    SRC_VADC_G2_SR0.B.SRE = 1;
 //   Adc_StartGroupConversion(AdcConf_AdcGroup_AdcHWGroup);

    Adc_SWGroup();
    

}

周期采样:

void Task_500ms_ASW(void)
{
  uint8 i=0;
  Adc_SWGroup();
  
}

注释: IoHwAb_AdcNotification64函数可以在里面添加自己想要的功能,在ADC完成转换后显示。软件触发需要周期调用函数Adc_StartGroupConversion才能获取新的数据,如果只在初始化的时候调用一次,只完成一次ADC转换。

### TC387 ADC触发原理及配置方法 #### 硬件PWM触发配置 对于TC387中的ADC模块,当采用硬件PWM触发时,大部分配置过程与软件触发相似。然而,特定于硬件触发的部分需要额外关注。在`AdcGroup`的设置中,通常将其设定为single以及Oneshot模式,并指定触发源为硬件触发[^1]。 针对硬件外部触发的选择(`AdcHwExtTrigSelect`)尤为关键,这决定了哪个事件能够启动一次新的转换周期。通过适当选择此选项,可以实现由定时器溢出、比较匹配或其他外设产生的信号来同步控制ADC采样时刻的目的。 #### 软件触发配置对比 相比之下,在软件触发场景下,可以通过调用API函数直接发起一次转换请求。例如,如果希望利用内核Q0执行软件触发,则需先创建相应的HW单元实例并完成基本参数设定;一旦触发条件满足即会激活该通道进行数据采集工作流程[^4]。 #### 初始化与权限管理 为了确保ADC驱动程序正常运作,特别是在涉及特殊功能寄存器(SFRs)访问的情况下,建议将初始化/反初始化接口置于较高权限级别运行——通常是监督者(supervisor)模式之下。这样做不仅提高了效率而且增强了系统的安全性[^3]。 ```python def configure_adc_hardware_trigger(): """ Configures the hardware trigger settings for an ADC group on a specific channel. This function sets up single and Oneshot modes with external hardware triggering, selecting appropriate triggers via AdcHwExtTrigSelect configuration parameter. """ pass # Placeholder implementation def initialize_adc_driver(privileged_mode=True): """Initializes the ADC driver, optionally setting it to operate in privileged mode.""" if privileged_mode: set_privilege_level('supervisor') ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nrt_ding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值