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

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

[复制链接]

  离线 

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

    [LV.4]

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

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

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

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

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


    本章主要在第十章ADC的基础上进行ADC注入通道管理(自动注入)。


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

    通过设置ADC控制寄存器1(ADC_CTLR1)的SCAN位为1进入ADC扫描模式。此模式用来扫描一组模拟通道,对被ADC_RSQRx寄存器(对规则通道)或 ADC_ISQR(对注入通道)选中的所有通道逐个执行单次转换,当前通道转换结束时,同一组的下一个通道被自动转换。

    在扫描模式里,根据 IAUTO 位的状态,又分为触发注入方式和自动注入方式。

    [1].自动注入

    如果设置了ADC控制寄存器1(ADC_CTLR1)IAUTO位,在开启规则通道完成之后,自动转换注入通道组使能位。这可以用来转换在ADC规则通道序列寄存器ADC_RSQRx和ADC注入通道序列寄存器ADC_ISQR寄存器中设置的多至20个转换序列。
    注意:在此模式里需要禁止注入通道的外部触发功能。

    如果除IAUTO位外还设置了ADC控制寄存器2(ADC_CTLR2)CONT位,规则通道至注入通道的转换序列被连续执行。
    对于ADC时钟预分频系数为4至8时,当从规则转换切换到注入序列或从注入转换切换到规则序列时,会自动插入1个ADC时钟间隔;当ADC时钟预分频系数为2时,则有2个ADC时钟间隔的延迟。
    注意:不可能同时使用自动注入和间断模式。

    [2].触发注入

    清除ADC_CTLR1寄存器的IAUTO位,并且设置SCAN位,即可启用触发注入功能。

    1. 利用外部触发或通过设置ADC_CTLR2寄存器的ADON位,启动一组规则通道的转换。
    2. 如果在规则通道转换期间产生一外部注入触发,当前转换被复位,注入通道序列被以单次扫描方式进行转换。
    3. 然后,恢复上次被中断的规则组通道转换。如果在注入转换期间产生一规则事件,注入转换不会被中断,但是规则序列将在注入序列结束后被执行。 下图为定时图。

    CH32V CH573单片机芯片-第三十四章:CH32V103应用教程——ADC-注入通道管理risc-v单片机中文社区(1)

    注意:当使用触发注入转换时,必须保证触发事件的间隔大于注入序列。

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


    2、硬件设计

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


    3、软件设计

    本章主要进行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. #endif
    复制代码
    adc.h文件主要进行相关函数的声明;
    adc.c文件
    1. #include "adc.h"

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

    12.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1, ENABLE );

    13.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
    14.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入
    15.     GPIO_Init(GPIOA, &GPIO_InitStructure);

    16.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
    17.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入
    18.     GPIO_Init(GPIOA, &GPIO_InitStructure);

    19.     RCC_ADCCLKConfig(RCC_PCLK2_Div6);

    20.     ADC_DeInit(ADC1);
    21.     ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
    22.     ADC_InitStructure.ADC_ScanConvMode = DISABLE;
    23.     ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
    24.     ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
    25.     ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    26.     ADC_InitStructure.ADC_NbrOfChannel = 1; //规则转换通道数目
    27.     ADC_Init(ADC1, &ADC_InitStructure);

    28.     ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5 );   //为所选ADC规则通道配置其转换顺序及其采样时间。
    29.     ADC_InjectedChannelConfig(ADC1, ADC_Channel_2, 1, ADC_SampleTime_239Cycles5 );  //为所选ADC注入通道配置其转换顺序及其采样时间。
    30.     ADC_AutoInjectedConvCmd(ADC1, ENABLE); //ADC规则通道转换完成之后,开启注入通道自动注入
    31.     ADC_Cmd(ADC1, ENABLE);

    32.     ADC_ResetCalibration(ADC1);
    33.     while(ADC_GetResetCalibrationStatus(ADC1));
    34.     ADC_StartCalibration(ADC1);
    35.     while(ADC_GetCalibrationStatus(ADC1));
    36. }

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

    64.     ADC_SoftwareStartConvCmd(ADC1, ENABLE);

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

    66.     val = ADC_GetConversionValue(ADC1);

    67.     return val;
    68. }
    复制代码
    adc.c文件主要进行ADC初始化配置以及规则通道和注入通道配置,具体如下:
    配置ADC1通道1 和通道2对应GPIO引脚PA1和PA2,并分别作为规则通道和注入通道,具体程序如下:
    1.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
    2.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入
    3.     GPIO_Init(GPIOA, &GPIO_InitStructure);

    4.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
    5.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入
    6.     GPIO_Init(GPIOA, &GPIO_InitStructure);
    复制代码
    1.     ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5 );   //为所选ADC规则通道配置其转换顺序及其采样时间。
    2.     ADC_InjectedChannelConfig(ADC1, ADC_Channel_2, 1, ADC_SampleTime_239Cycles5 );  //为所选ADC注入通道配置其转换顺序及其采样时间。
    3.     ADC_AutoInjectedConvCmd(ADC1, ENABLE); //ADC规则通道转换完成之后,开启注入通道自动注入
    复制代码

    main.c文件

    1. int main(void)
    2. {
    3.     u16 adc_val;
    4.     u16 adc_jval;

    5.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    6.         Delay_Init();
    7.         USART_Printf_Init(115200);
    8.         ADC_Function_Init();

    9.         printf("SystemClk:%d\r\n",SystemCoreClock);
    10.         printf("This is ADC example\r\n");

    11.         while(1)
    12.        {
    13.                 ADC_SoftwareStartConvCmd(ADC1, ENABLE);
    14.                 while( !ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) );
    15.                 adc_val = ADC_GetConversionValue(ADC1);
    16.                 adc_jval = ADC_GetInjectedConversionValue(ADC1, ADC_InjectedChannel_1);
    17.                 Delay_Ms(500);
    18.                 printf( "val:%d\r\n", adc_val );
    19.                 printf( "jval:%d\r\n", adc_jval );
    20.                 Delay_Ms(2);
    21.         }
    22. }
    复制代码
    main.c文件主要进行函数初始化以及规则通道组和注入通道组ADC值打印输出。


    4、下载验证

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

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







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

    使用道具 举报

    高级模式
    B Color Image Link Quote Code Smilies

    本版积分规则

    关闭

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



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

    GMT+8, 2024-4-25 18:01 , Processed in 0.598573 second(s), 48 queries .

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