查看: 1562|回复: 0
收起左侧

第三十三章:CH32V103应用教程——ADC-模拟看门狗

[复制链接]

  离线 

  • TA的每日心情
    慵懒
    2021-7-23 17:16
  • 签到天数: 17 天

    [LV.4]

    发表于 2021-4-27 18:38:04 | 显示全部楼层 |阅读模式

    有人预言,RISC-V或将是继Intel和Arm之后的第三大主流处理器体系。欢迎访问全球首家只专注于RISC-V单片机行业应用的中文网站

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    本帖最后由 草帽王子 于 2021-9-10 17:18 编辑

    本章主要在第十章ADC和第三十一章ADC-单通道中断读取方式的基础上进行ADC模拟看门狗实验。


    1、ADC简介及相关函数介绍

    关于ADC模拟看门狗:如果被ADC转换的模拟电压低于低阀值或高于高阀值,AWD模拟看门狗状态位被设置。阀值设置位于ADC_WDHTR和 ADC_WDLTR寄存器的最低12个有效位中。通过设置ADC_CTLR1寄存器的 AWDIE位以允许产生相应中断。
    模拟看门狗阈值区:
    CH32V CH573单片机芯片-第三十三章:CH32V103应用教程——ADC-模拟看门狗risc-v单片机中文社区(1)

    配置ADC_CTLR1寄存器的AWDSGL、RAWDEN、IAWDEN及AWDCH[4:0]位选择模拟看门狗警戒的通道,具体关系见下表:
    模拟看门狗通道选择:
    CH32V CH573单片机芯片-第三十三章:CH32V103应用教程——ADC-模拟看门狗risc-v单片机中文社区(2)

    关于ADC具体信息,可参考CH32V103应用手册。关于ADC库函数,在第十章节已进行过介绍,在此不再赘述。


    2、硬件设计

    本章教程通过读取ADC1通道1的值,当ADC值超过模拟看门狗阈值区,则产生相应中断。


    3、软件设计

    本章主要进行ADC模拟看门狗实验,本章教程在第十章ADC和第三十一章ADC-单通道中断读取方式基础上进行,相关内容可参考前面章节。ADC模拟看门狗应用程序具体如下:
    adc.h文件
    1. #ifndef __ADC_H
    2. #define __ADC_H

    3. #include "ch32v10x_conf.h"

    4. void ADC_Function_Init(void);
    5. u16 Get_ADC_Val(u8 ch);
    6. void ADC1_2_IRQHandler(void);

    7. #endif
    复制代码
    adc.h文件主要进行相关函数的声明;
    adc.c文件

    1. #include "adc.h"

    2. void ADC1_2_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));

    3. /*******************************************************************************
    4. * Function Name  : ADC_Function_Init
    5. * Description    : Initializes ADC collection.
    6. * Input          : None
    7. * Return         : None
    8. *******************************************************************************/
    9. void ADC_Function_Init(void)
    10. {
    11.     GPIO_InitTypeDef GPIO_InitStructure;
    12.     ADC_InitTypeDef  ADC_InitStructure;
    13.     NVIC_InitTypeDef NVIC_InitStructure;

    14.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1, ENABLE );

    15.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
    16.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    17.     GPIO_Init(GPIOA, &GPIO_InitStructure);

    18.     RCC_ADCCLKConfig(RCC_PCLK2_Div6);

    19.     ADC_DeInit(ADC1);
    20.     ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
    21.     ADC_InitStructure.ADC_ScanConvMode = DISABLE;
    22.     ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
    23.     ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
    24.     ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    25.     ADC_InitStructure.ADC_NbrOfChannel = 1;
    26.     ADC_Init(ADC1, &ADC_InitStructure);

    27. /* Higher Threshold:3500, Lower Threshold:2000 */
    28.     ADC_AnalogWatchdogThresholdsConfig(ADC1, 3500, 2000);
    29.     ADC_AnalogWatchdogSingleChannelConfig( ADC1, ADC_Channel_1);
    30.     ADC_AnalogWatchdogCmd( ADC1, ADC_AnalogWatchdog_SingleRegEnable);

    31.     NVIC_InitStructure.NVIC_IRQChannel = ADC1_2_IRQn;
    32.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
    33.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    34.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    35.     NVIC_Init(&NVIC_InitStructure);

    36.     ADC_ITConfig( ADC1, ADC_IT_AWD, ENABLE);
    37.     ADC_Cmd(ADC1, ENABLE);

    38.     ADC_ResetCalibration(ADC1);
    39.     while(ADC_GetResetCalibrationStatus(ADC1));
    40.     ADC_StartCalibration(ADC1);
    41.     while(ADC_GetCalibrationStatus(ADC1));
    42. }

    43. /*******************************************************************************
    44. * Function Name  : Get_ADC_Val
    45. * Description    : Returns ADCx conversion result data.
    46. * Input          : ch: ADC channel.
    47. *                    ADC_Channel_0: ADC Channel0 selected.
    48. *                    ADC_Channel_1: ADC Channel1 selected.
    49. *                    ADC_Channel_2: ADC Channel2 selected.
    50. *                    ADC_Channel_3: ADC Channel3 selected.
    51. *                    ADC_Channel_4: ADC Channel4 selected.
    52. *                    ADC_Channel_5: ADC Channel5 selected.
    53. *                    ADC_Channel_6: ADC Channel6 selected.
    54. *                    ADC_Channel_7: ADC Channel7 selected.
    55. *                    ADC_Channel_8: ADC Channel8 selected.
    56. *                    ADC_Channel_9: ADC Channel9 selected.
    57. *                    ADC_Channel_10: ADC Channel10 selected.
    58. *                    ADC_Channel_11: ADC Channel11 selected.
    59. *                    ADC_Channel_12: ADC Channel12 selected.
    60. *                    ADC_Channel_13: ADC Channel13 selected.
    61. *                    ADC_Channel_14: ADC Channel14 selected.
    62. *                    ADC_Channel_15: ADC Channel15 selected.
    63. *                    ADC_Channel_16: ADC Channel16 selected.
    64. *                    ADC_Channel_17: ADC Channel17 selected.
    65. * Return         : val: The Data conversion value.
    66. *******************************************************************************/
    67. u16 Get_ADC_Val(u8 ch)
    68. {
    69.     u16 val;

    70.     ADC_RegularChannelConfig(ADC1,ADC_Channel_1, 1, ADC_SampleTime_239Cycles5 );

    71.     ADC_SoftwareStartConvCmd(ADC1, ENABLE);

    72.     while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));

    73.     val = ADC_GetConversionValue(ADC1);

    74.     return val;
    75. }


    76. /*******************************************************************************
    77. * Function Name  : ADC1_2_IRQHandler
    78. * Description    : This function handles analog wathdog exception.
    79. * Input          : None
    80. * Return         : None
    81. *******************************************************************************/
    82. void ADC1_2_IRQHandler(void)
    83. {
    84.     if(ADC_GetITStatus( ADC1, ADC_IT_AWD))
    85.     {
    86.         printf( "Enter AnalogWatchdog Interrupt\r\n" );
    87.     }

    88.     ADC_ClearITPendingBit( ADC1, ADC_IT_AWD);
    89. }
    复制代码

    adc.c文件主要进行ADC模拟看门狗初始化配置,在第十章ADC初始化基础上,主要进行如下改动:
    因为本次为ADC模拟看门狗,因此需要对模拟看门狗的高低阈值进行配置;此外,还需对ADC模拟看门狗所用单通道进行配置;最后使能单通道模拟看门狗,具体程序如下:
    1. /* Higher Threshold:3500, Lower Threshold:2000 */
    2.     ADC_AnalogWatchdogThresholdsConfig(ADC1, 3500, 2000);
    3.     ADC_AnalogWatchdogSingleChannelConfig( ADC1, ADC_Channel_1);
    4.     ADC_AnalogWatchdogCmd( ADC1, ADC_AnalogWatchdog_SingleRegEnable);
    复制代码

    因为需要用到中断,因此需要对NVIC进行初始化配置;
    1.     NVIC_InitStructure.NVIC_IRQChannel = ADC1_2_IRQn;
    2.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
    3.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    4.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    5.     NVIC_Init(&NVIC_InitStructure);
    复制代码

    因为模拟看门狗,此处还需要使能模拟看门狗中断,具体如下:

    1. ADC_ITConfig( ADC1, ADC_IT_AWD, ENABLE);
    复制代码

    关于中断服务函数,当ADC值不在模拟看门狗阈值范围内时,就会进入中断,关于中断服务函数,具体如下:

    1. void ADC1_2_IRQHandler(void)
    2. {
    3.     if(ADC_GetITStatus( ADC1, ADC_IT_AWD))
    4.     {
    5.         printf( "Enter AnalogWatchdog Interrupt\r\n" );
    6.     }

    7.     ADC_ClearITPendingBit( ADC1, ADC_IT_AWD);
    8. }
    复制代码

    main.c文件


    1. int main(void)
    2. {
    3.     u16 ADC_val;

    4.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    5.         Delay_Init();
    6.         USART_Printf_Init(115200);
    7.         ADC_Function_Init();
    8.         printf("SystemClk:%d\r\n",SystemCoreClock);
    9.         printf("This is ADC example\r\n");

    10.         while(1)
    11.         {
    12.             ADC_val = Get_ADC_Val( ADC_Channel_1);
    13.             Delay_Ms(500);
    14.             printf( "%d\r\n", ADC_val );
    15.             Delay_Ms(2);
    16.         }
    17. }
    复制代码
    main.c文件主要进行函数初始化以及ADC值打印输出。


    4、下载验证

    将编译好的程序下载到开发板并复位,当PA1引脚接3.3V或GND时,不在阈值范围内,串口显示如下:
    CH32V CH573单片机芯片-第三十三章:CH32V103应用教程——ADC-模拟看门狗risc-v单片机中文社区(3)
    CH32V CH573单片机芯片-第三十三章:CH32V103应用教程——ADC-模拟看门狗risc-v单片机中文社区(4)
    CH32V CH573单片机芯片-第三十三章:CH32V103应用教程——ADC-模拟看门狗risc-v单片机中文社区(5) 32、ADC-模拟看门狗.rar (488.39 KB, 下载次数: 10)
    链接:https://pan.baidu.com/s/1njRuakFO7RVL5eAaDvy3Nw

    提取码:aopl
    复制这段内容后打开百度网盘手机App,操作更方便哦






    上一篇:第三十二章:CH32V103应用教程——ADC-外部触发转换
    下一篇:第三十四章:CH32V103应用教程——ADC-注入通道管理
    RISCV作者优文
    全球首家只专注于RISC-V单片机行业应用的中文网站
    回复

    使用道具 举报

    高级模式
    B Color Image Link Quote Code Smilies

    本版积分规则

    关闭

    RISC-V单片机中文网上一条 /2 下一条



    版权及免责声明|RISC-V单片机中文网 |网站地图

    GMT+8, 2024-4-26 10:44 , Processed in 0.705989 second(s), 48 queries .

    快速回复 返回顶部 返回列表