ADC实现模拟看门狗

功能说明

模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高低阈值, 用户可以预先设定个模拟看门狗的上下限电压值,一旦采集到的电压超出该上下限, 将会触发模拟看门狗中断。 模拟看门狗一般用于检测单个的常规或注入转换通道。

方法说明

模拟看门狗可以预先设置 ADC 转换的高低阈值, ADC_CMP0和ADC_CMP1可以自由配置为模拟看门狗的上下限阈值,需要注意的是,作为上限的寄存器需要设置为ADC_CMP_H触发中断,作为下限的寄存器要设置为ADC_CMP_L触发中断,下面的例程中使用ADC_CMP0 寄存器来配置 ADC 转换的下限阈值, ADC_CMP1 寄存器来配置ADC 转换的上限阈值。以173为例,设置输入电压的检测码值为1024-3072(对应电压为1.25V-3.75V,电压=码值*5V/4095),先配置PA6管脚为高电平,当ADC采集到的电压不在区间内时,触发中断处理函数,此处配置为将PA6拉低,代码如下所示。

配置步骤

1.初始化ADC中断函数,设置ADC_CMP0_L和ADC_CMP1_H中断触发时,将PA6拉低;

2.初始化ADC函数,设置ADC通道为ADCIN0,重复采样次数和平均系数为512,降低随机干扰;

3.设置ADC转换模式为连续转换;

4.设置ADC_CMP0和ADC_CMP1的阈值和中断;

5.启动ADC;

void adc_irqhandler(csp_adc_t *ptAdcBase)
{
        uint32_t wIntStat = csp_adc_get_sr(ptAdcBase) & csp_adc_get_imr(ptAdcBase);//ADC_SR & ADC_IMR
        while ((wIntStat == 1<<5)||(wIntStat == 1<<6))
        {
                csi_pin_pull_mode(PA6,GPIO_PULLDOWN);
        }
}
int adc_awdg_int_demo(void)
{
        const csi_adc_seq_t tSeqCfg[] =
    {
        //输入通道                //连续重复采样次数                //平均系数                        //触发源选择
        {ADCIN0,                ADC_CV_COUNT_512,                        ADC_AVG_COF_512,                ADCSYNC_NONE},
    }; 
        volatile uint8_t byChnlNum = sizeof(tSeqCfg)/sizeof(tSeqCfg[0]);
        volatile uint16_t        g_hwAdcBuf[sizeof(tSeqCfg)/sizeof(tSeqCfg[0])];
        csi_adc_config_t tAdcConfig;
        
        //adc 输入管脚配置
        csi_pin_set_mux(PC13, PC13_ADC_INA0);                                //ADC GPIO作为输入通道
        csi_pin_set_mux(PA6,PA6_OUTPUT);
        csi_pin_pull_mode(PA6,GPIO_PULLUP);
        //adc 参数配置初始化
        tAdcConfig.byClkDiv = 0x02;                                                        //ADC clk两分频:clk = pclk/2
        tAdcConfig.byClksel = ADC_PCLK;                                                //ADC clk选择:PCLK
        tAdcConfig.bySampHold = 0x06;                                                //ADC 采样时间: time = 16 + 6 = 22(ADC clk周期)
        tAdcConfig.byConvMode = ADC_CONV_CONTINU;                        //ADC 转换模式: 连续转换;
        tAdcConfig.byVrefSrc = ADCVERF_VDD_VSS;                                //ADC 参考电压: 系统VDD
        tAdcConfig.wInt = ADC_INTSRC_NONE;                                //ADC 中断配置: 无中断
        tAdcConfig.ptSeqCfg = (csi_adc_seq_t *)tSeqCfg;                //ADC 采样序列: 具体参考结构体变量 tSeqCfg
        
        csi_adc_set_clk(ADC0,tAdcConfig.byClksel);                //配置ADC采样序列
        csi_adc_init(ADC0, &tAdcConfig);                                                        //初始化ADC参数配置        
        csi_adc_set_seqx(ADC0, tAdcConfig.ptSeqCfg, byChnlNum);                //配置ADC采样序列
        csi_adc_set_cmp0(ADC0,ADCIN0,1024,ADC_CMP_L);//设置CMP0作为AWDG的下限值1024
        csi_adc_set_cmp1(ADC0,ADCIN0,3072,ADC_CMP_H);//设置CMP1作为AWDG的上限值3072
        csi_adc_set_buffer((uint16_t *)g_hwAdcBuf, 1);                                //传递ADC采样buffer,ADC采样值存放于此buffer中
        csi_adc_start(ADC0);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值