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

第三十五章:CH32V103应用教程——ADC-注入通道管理

[复制链接]

  离线 

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

    [LV.4]

    发表于 2021-4-27 20:37:06 | 显示全部楼层 |阅读模式

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

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

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

    CH32V103应用教程——ADC-注入通道管理(触发注入)


    本章主要在第三十二章以及第三十四章基础上进行ADC注入通道管理(触发注入)。


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

    关于ADC触发注入:IAUTO位为 0,当在扫描规则组通道过程中,发生了注入组通道转换的触发事件,当前转换被复位,注入通道的序列被以单次扫描方式进行,在所有选中的注入组通道扫描转换结束后,恢复上次被中断的规则组通道转换。

    如果当前在扫描注入组通道序列时,发生了规则通道的启动事件,注入组转换不会被中断,而是在注入序列转换完成后再执行规则序列的转换。

    注意:使用触发注入转换时,必须保证触发事件的间隔长于注入序列。例如,完成注入序列的转换总体时间需要28个ADCCLK,那么触发注入通道的事件间隔时间最小值为 29个ADCCLK。

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


    2、硬件设计

    本章教程主要采用触发注入方式进行注入通道管理,需要用到ADC1通道1(PA1)和ADC1通道2(PA2)分别作为规则通道和注入通道以及EXTI线15(即PA15)作为触发端,同时将PA1引脚和PA2引脚与3.3V引脚和GND引脚连接进行ADC值读取输出。


    3、软件设计

    本章主要进行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.    
    19.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
    20.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    21.     GPIO_Init(GPIOA, &GPIO_InitStructure);

    22.     RCC_ADCCLKConfig(RCC_PCLK2_Div6);

    23.     ADC_DeInit(ADC1);
    24.     ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
    25.     ADC_InitStructure.ADC_ScanConvMode = ENABLE;
    26.     ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
    27.     ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;;
    28.     ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    29.     ADC_InitStructure.ADC_NbrOfChannel = 1;
    30.     ADC_Init(ADC1, &ADC_InitStructure);

    31.     //规则通道组
    32.     ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5 ); //为所选ADC规则通道配置其转换顺序及其采样时间。

    33.     //注入通道组相关配置
    34.     //ADC_InjectedDiscModeCmd(ADC1,DISABLE);   //启用ADC1注入通道连续模式
    35.     ADC_InjectedSequencerLengthConfig(ADC1, 1);    //配置注入通道序列长度
    36.     ADC_InjectedChannelConfig(ADC1, ADC_Channel_2, 1, ADC_SampleTime_239Cycles5);          //为所选ADC注入通道配置其转换顺序及其采样时间。
    37.     ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_Ext_IT15_TIM8_CC4); //设置注入通道外部触发,此处选择EXTI线15触发
    38.     ADC_ExternalTrigInjectedConvCmd(ADC1, ENABLE); //设置通过外部触发启用注入通道转换
    39.     //ADC_AutoInjectedConvCmd(ADC1, DISABLE); //关闭注入通道组在规则转换完成之后进行自动转换

    40.     NVIC_InitStructure.NVIC_IRQChannel = ADC1_2_IRQn;
    41.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
    42.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    43.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    44.     NVIC_Init(&NVIC_InitStructure);

    45.     ADC_ITConfig( ADC1, ADC_IT_JEOC, ENABLE);
    46.     ADC_Cmd(ADC1, ENABLE);

    47.     ADC_ResetCalibration(ADC1);
    48.     while(ADC_GetResetCalibrationStatus(ADC1));
    49.     ADC_StartCalibration(ADC1);
    50.     while(ADC_GetCalibrationStatus(ADC1));
    51.     ADC_SoftwareStartConvCmd(ADC1, ENABLE);
    52. }

    53. /*******************************************************************************
    54. * Function Name  : EXTI_Event_Init
    55. * Description    : Initializes EXTI.
    56. * Input          : None
    57. * Return         : None
    58. *******************************************************************************/
    59. void EXTI_Event_Init(void)
    60. {
    61.     GPIO_InitTypeDef GPIO_InitStructure;
    62.     EXTI_InitTypeDef EXTI_InitStructure;

    63.     RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE );

    64.     GPIO_EXTILineConfig( GPIO_PortSourceGPIOA, GPIO_PinSource15 );

    65.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
    66.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //下拉输入模式
    67.     GPIO_Init(GPIOA, &GPIO_InitStructure);

    68.     EXTI_InitStructure.EXTI_Line = EXTI_Line15;
    69.     EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Event;
    70.     EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //上升沿触发
    71.     EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    72.     EXTI_Init(&EXTI_InitStructure);
    73. }

    74. /*******************************************************************************
    75. * Function Name  : ADC1_2_IRQHandler
    76. * Description    : This function handles analog watchdog exception.
    77. * Input          : None
    78. * Return         : None
    79. *******************************************************************************/
    80. void ADC1_2_IRQHandler()
    81. {

    82.     u16 jadc;

    83.     if(ADC_GetITStatus( ADC1, ADC_IT_JEOC))
    84.     {
    85.         printf("ADC外部触发注入转换\r\n");
    86.         jadc = ADC_GetInjectedConversionValue(ADC1, ADC_InjectedChannel_1);
    87.         printf( "jadc=%d\r\n", jadc );
    88.     }

    89.     ADC_ClearITPendingBit( ADC1, ADC_IT_JEOC);
    90. }
    复制代码

    adc.c文件主要进行ADC初始化配置以及规则通道和注入通道配置,与第三十二章以及第三十四章相比,主要进行以下改动:
    开启ADC扫描模式以及连续转换模式:
    1. ADC_InitStructure.ADC_ScanConvMode = ENABLE;
    2.     ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
    复制代码

    对注入通道组进行相关配置,配置注入通道序列长度,配置注入通道转换顺序及采样时间,启用外部触发触发注入通道转换,具体如下:
    1. ADC_InjectedSequencerLengthConfig(ADC1, 1);    //配置注入通道序列长度
    2.     ADC_InjectedChannelConfig(ADC1, ADC_Channel_2, 1, ADC_SampleTime_239Cycles5);          //为所选ADC注入通道配置其转换顺序及其采样时间。
    3.     ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_Ext_IT15_TIM8_CC4); //设置注入通道外部触发,此处选择EXTI线15触发
    4.     ADC_ExternalTrigInjectedConvCmd(ADC1, ENABLE); //设置通过外部触发启用注入通道转换
    复制代码

    开启ADC注入转换中断:

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

    在中断服务函数中,读取并打印输出注入通道ADC值:
    1. void ADC1_2_IRQHandler()
    2. {

    3.     u16 jadc;

    4.     if(ADC_GetITStatus( ADC1, ADC_IT_JEOC))
    5.     {
    6.         printf("ADC外部触发注入转换\r\n");
    7.         jadc = ADC_GetInjectedConversionValue(ADC1, ADC_InjectedChannel_1);
    8.         printf( "jadc=%d\r\n", jadc );
    9.     }

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

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

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

    9.     ADC_Function_Init();
    10.     EXTI_Event_Init();

    11.         while(1)
    12.     {
    13.         while( !ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) );
    14.         adc = ADC_GetConversionValue(ADC1);
    15.         Delay_Ms(500);
    16.         printf( "adc=%d\r\n", adc );
    17.         Delay_Ms(2);
    18.         }
    19. }
    复制代码
    main.c文件主要进行函数初始化以及规则通道ADC值打印输出。


    4、下载验证

    将编译好的程序下载到开发板并复位,同时将PA1引脚和PA2引脚与开发板3.3V引脚或GND引脚连接起来,将PA15与3.3V引脚连接时,触发注入转换,串口显示如下:

    CH32V CH573单片机芯片-第三十五章:CH32V103应用教程——ADC-注入通道管理risc-v单片机中文社区(1)
    ADC-注入通道管理(触发注入).rar
    CH32V CH573单片机芯片-第三十五章:CH32V103应用教程——ADC-注入通道管理risc-v单片机中文社区(2) 34、ADC-注入通道管理(触发注入).rar (489.81 KB, 下载次数: 10)
    链接:https://pan.baidu.com/s/1Tnp7pv4nMd95EGRXNa5o3A
    提取码:lxzn
    复制这段内容后打开百度网盘手机App,操作更方便哦







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

    使用道具 举报

    高级模式
    B Color Image Link Quote Code Smilies

    本版积分规则

    关闭

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



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

    GMT+8, 2024-3-29 10:28 , Processed in 0.481593 second(s), 48 queries .

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