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

第三十二章:CH32V103应用教程——ADC-外部触发转换

[复制链接]

  离线 

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

    [LV.4]

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

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

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

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

    本章主要在上一章ADC-单通道中断读取方式的基础上进行ADC外部触发转换,本章主要进行规则组的外部触发转换,并在中断服务函数中读取ADC值。


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

    ADC转换的启动事件可以由外部事件触发。如果设置了ADC_CTLR2寄存器(ADC控制寄存器2)的REXTTRI或IEXTTRIG位,则可分别通过外部事件触发规则组或注入组通道的转换。此时,REXTSEL[2:0]和IEXTSEL[2:0]位的配置决定规则组和注入组的外部事件源,具体如下:
    规则通道组的外部触发源:

    CH32V CH573单片机芯片-第三十二章:CH32V103应用教程——ADC-外部触发转换risc-v单片机中文社区(1)

    注入通道组的外部触发源:

    CH32V CH573单片机芯片-第三十二章:CH32V103应用教程——ADC-外部触发转换risc-v单片机中文社区(2)
    本章通过EXTI线11触发规则通道组AD转换。

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


    2、硬件设计

    本章教程通过PA11(EXTI线11)连接GND引脚触发规则通道组AD转换,此时可通过ADC1通道1读取开发板3.3V引脚或GND引脚ADC值,并通过串口调试助手打印显示出来。其中ADC1通道1对应PA1引脚,在进行使用测试时只需用杜邦线将PA1引脚与3.3V 引脚和GND引脚连接即可。


    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. void EXTI_Event_Init(void);

    6. #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_Ext_IT11_TIM8_TRGO; //启用外部触发,此处由EXTI线11触发
    24.     ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    25.     ADC_InitStructure.ADC_NbrOfChannel = 1;
    26.     ADC_Init(ADC1, &ADC_InitStructure);


    27.     ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_55Cycles5);

    28.     ADC_ExternalTrigConvCmd(ADC1, ENABLE); //使能通过外部触发器启用ADC转换

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

    34.     ADC_ITConfig( ADC1, ADC_IT_EOC, ENABLE);
    35.     ADC_Cmd(ADC1, ENABLE);

    36.     ADC_ResetCalibration(ADC1);
    37.     while(ADC_GetResetCalibrationStatus(ADC1));
    38.     ADC_StartCalibration(ADC1);
    39.     while(ADC_GetCalibrationStatus(ADC1));
    40. }

    41. /*******************************************************************************
    42. * Function Name  : EXTI_Event_Init
    43. * Description    : Initializes EXTI.
    44. * Input          : None
    45. * Return         : None
    46. *******************************************************************************/
    47. void EXTI_Event_Init(void)
    48. {
    49.     EXTI_InitTypeDef EXTI_InitStructure;
    50.     GPIO_InitTypeDef GPIO_InitStructure;

    51.     RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE );

    52.     GPIO_EXTILineConfig( GPIO_PortSourceGPIOA, GPIO_PinSource11 );

    53.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
    54.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入模式
    55.     GPIO_Init(GPIOA, &GPIO_InitStructure);

    56.     EXTI_InitStructure.EXTI_Line = EXTI_Line11;
    57.     EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Event;
    58.     EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
    59.     EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    60.     EXTI_Init(&EXTI_InitStructure);
    61. }

    62. /*******************************************************************************
    63. * Function Name  : ADC1_2_IRQHandler
    64. * Description    : This function handles analog watchdog exception.
    65. * Input          : None
    66. * Return         : None
    67. *******************************************************************************/
    68. void ADC1_2_IRQHandler()
    69. {
    70.     u16 ADC_val;

    71.     if(ADC_GetITStatus( ADC1, ADC_IT_EOC)==SET)
    72.     {
    73.         printf("ADC Extline trigger conversion...\r\n");
    74.         ADC_val = ADC_GetConversionValue(ADC1);
    75.         printf( "ADC=%d\r\n", ADC_val );
    76.     }

    77.     ADC_ClearITPendingBit( ADC1, ADC_IT_EOC);
    78. }
    复制代码
    adc.c文件主要进行ADC对应GPIO初始化配置、ADC初始化配置、NVIC初始化配置以及EXTI初始化配置,其相较于上一章ADC单通道中断读取方式,主要进行以下修改:

    在ADC初始化配置中,启用外部触发,此处由EXTI线11触发规则通道组AD转换,具体如下:
    1. ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_Ext_IT11_TIM8_TRGO; //启用外部触发,此处由EXTI线11触发
    复制代码

    由于启用外部触发,ADC初始化配置中需使能通过外部触发器启用ADC转换,具体如下:
    1. ADC_ExternalTrigConvCmd(ADC1, ENABLE); //使能通过外部触发器启用ADC转换
    复制代码

    关于EXTI初始化配置,可参考第四章教程EXTI,在此不再赘述;

    关于ADC中断服务函数,当ADC转换结束完成,读取当前ADC值,并打印显示,具体如下:
    1. void ADC1_2_IRQHandler()
    2. {
    3.     u16 ADC_val;

    4.     if(ADC_GetITStatus( ADC1, ADC_IT_EOC)==SET)
    5.     {
    6.         printf("ADC Extline trigger conversion...\r\n");
    7.         ADC_val = ADC_GetConversionValue(ADC1);
    8.         printf( "ADC=%d\r\n", ADC_val );
    9.     }

    10.     ADC_ClearITPendingBit( ADC1, ADC_IT_EOC);
    11. }
    复制代码

    main.c文件
    1. int main(void)
    2. {
    3.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    4.         Delay_Init();
    5.         USART_Printf_Init(115200);
    6.         printf("SystemClk:%d\r\n",SystemCoreClock);

    7.         printf("This is ADC example\r\n");

    8.     ADC_Function_Init();
    9.     EXTI_Event_Init();

    10.         while(1)
    11.         {
    12.         }
    13. }
    复制代码
    mian.c文件主要进行函数初始化。


    4、下载验证

    将编译好的程序下载到开发板并复位,串口显示如下:
    CH32V CH573单片机芯片-第三十二章:CH32V103应用教程——ADC-外部触发转换risc-v单片机中文社区(3)

    将PA1与开发板3.3V引脚连接起来,同时将PA11与GND引脚连接起来(下降沿触发),串口显示如下:
    CH32V CH573单片机芯片-第三十二章:CH32V103应用教程——ADC-外部触发转换risc-v单片机中文社区(4)

    将PA1与开发板GND引脚连接起来,串口显示如下:
    CH32V CH573单片机芯片-第三十二章:CH32V103应用教程——ADC-外部触发转换risc-v单片机中文社区(5)

    因为此处配置ADC连续转换模式,因此只需要触发一次,ADC即可进行不停转换;当配置ADC非连续转换模式时,触发一次即进行一次转换。

    ADC-外部触发.rar附件下载
    CH32V CH573单片机芯片-第三十二章:CH32V103应用教程——ADC-外部触发转换risc-v单片机中文社区(6) 31、ADC-外部触发.rar (483.95 KB, 下载次数: 9)
    链接:https://pan.baidu.com/s/1oqIfh6bPziVh1kP2mkYXcQ
    提取码:3gi9
    复制这段内容后打开百度网盘手机App,操作更方便哦







    上一篇:第三十一章:CH32V103应用教程——ADC-单通道中断读取方式
    下一篇:第三十三章:CH32V103应用教程——ADC-模拟看门狗
    RISCV作者优文
    全球首家只专注于RISC-V单片机行业应用的中文网站
    回复

    使用道具 举报

    高级模式
    B Color Image Link Quote Code Smilies

    本版积分规则

    关闭

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



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

    GMT+8, 2024-4-23 23:27 , Processed in 0.755912 second(s), 48 queries .

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