这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 上一修订版 两侧同时换到之后的修订记录 | ||
icore4tx_56 [2020/07/29 16:55] fmj [三、实验原理] |
icore4tx_56 [2020/07/29 17:21] fmj [附录:] |
||
---|---|---|---|
行 122: | 行 122: | ||
* 功能码的作用是指明从设备要执行的动作。 | * 功能码的作用是指明从设备要执行的动作。 | ||
* 数据域包括附加信息,从设备使用这个信息执行功能码定义的操作。这个域还包括离散项目和寄存器地址、处理的项目数量以及域中的实际数据字节数。在某种请求中,数据域可以是不存在的(0长度),在此情况下服务器不需要任何附加信息,功能码仅说明操作。 | * 数据域包括附加信息,从设备使用这个信息执行功能码定义的操作。这个域还包括离散项目和寄存器地址、处理的项目数量以及域中的实际数据字节数。在某种请求中,数据域可以是不存在的(0长度),在此情况下服务器不需要任何附加信息,功能码仅说明操作。 | ||
- | 错误校验域是对报文内容执行“冗余校验”的计算结果。根据不同的传输模式(RTU或ASCII)使用两种不同的计算方法。 | + | * 错误校验域是对报文内容执行“冗余校验”的计算结果。根据不同的传输模式(RTU或ASCII)使用两种不同的计算方法。 |
* **传输模式:** | * **传输模式:** | ||
* 控制器能设置为两种传输模式(ASCII和RTU)中的任何一种在标准的Modbus网络通信。用户选择想要的模式,包括串口通信参数(波特率、校验方式等),在配置每个控制器的时候,在一个Modbus网络上所有设备都必须选择相同的传输模式和串口参数。 | * 控制器能设置为两种传输模式(ASCII和RTU)中的任何一种在标准的Modbus网络通信。用户选择想要的模式,包括串口通信参数(波特率、校验方式等),在配置每个控制器的时候,在一个Modbus网络上所有设备都必须选择相同的传输模式和串口参数。 | ||
行 236: | 行 236: | ||
* 响应 | * 响应 | ||
* 和发送指令相同。 | * 和发送指令相同。 | ||
+ | |||
* 写多个线圈寄存器0FH: | * 写多个线圈寄存器0FH: | ||
* 写多个线圈寄存器,若数据区的某位值为“1”表示被请求的相应线圈状态为ON,若某位值为“0”,则状态为OFF。 | * 写多个线圈寄存器,若数据区的某位值为“1”表示被请求的相应线圈状态为ON,若某位值为“0”,则状态为OFF。 | ||
行 253: | 行 254: | ||
* 保持寄存器起始地址为0x0034,写2个寄存器4个字节数据 | * 保持寄存器起始地址为0x0034,写2个寄存器4个字节数据 | ||
{{ :icore4tx:icore4tx_arm_hal_56_27.png?direct&800 |}} | {{ :icore4tx:icore4tx_arm_hal_56_27.png?direct&800 |}} | ||
- | |||
- | * 响应 | ||
{{ :icore4tx:icore4tx_arm_hal_56_28.png?direct&800 |}} | {{ :icore4tx:icore4tx_arm_hal_56_28.png?direct&800 |}} | ||
+ | * 响应 | ||
+ | {{ :icore4tx:icore4tx_arm_hal_56_29.png?direct&800 |}} | ||
=== 2.RS-485介绍 === | === 2.RS-485介绍 === | ||
行 271: | 行 272: | ||
* 积分型:积分型AD工作原理是将输入电压转换成时间(脉冲宽度信号)或频率(脉冲频率),然后由定时器/计数器获得数字值。其优点是用简单电路就能获得高分辨率,抗干扰能力强,但缺点是由于转换精度依赖于积分时间,因此转换速率极低。初期的单片AD转换器大多采用积分型,现在逐次比较型已逐步成为主流。 | * 积分型:积分型AD工作原理是将输入电压转换成时间(脉冲宽度信号)或频率(脉冲频率),然后由定时器/计数器获得数字值。其优点是用简单电路就能获得高分辨率,抗干扰能力强,但缺点是由于转换精度依赖于积分时间,因此转换速率极低。初期的单片AD转换器大多采用积分型,现在逐次比较型已逐步成为主流。 | ||
* 逐次比较型:逐次比较型AD由一个比较器和DA转换器通过逐次比较逻辑构成,从MSB开始,顺序地对每一位将输入电压与内置DA转换器输出进行比较,经n次比较而输出数字值。其电路规模属于中等。其优点是速度较高、功耗低,在低分辨率(<12位)时价格便宜,但高精度(>12位)时价格很高。 | * 逐次比较型:逐次比较型AD由一个比较器和DA转换器通过逐次比较逻辑构成,从MSB开始,顺序地对每一位将输入电压与内置DA转换器输出进行比较,经n次比较而输出数字值。其电路规模属于中等。其优点是速度较高、功耗低,在低分辨率(<12位)时价格便宜,但高精度(>12位)时价格很高。 | ||
- | 并行比较型/串并行比较型:并行比较型AD采用多个比较器,仅作一次比较而实行转换,又称FLash(快速)型。由于转换速率极高,n位的转换需要2n-1个比较器,因此电路规模也极大,价格也高,只适用于视频AD转换器等速度特别高的领域。串并行比较型AD结构上介于并行型和逐次比较型之间,最典型的是由2个n/2位的 * 并行型AD转换器配合DA转换器组成,用两次比较实行转换,所以称为 Half flash(半快速)型。还有分成三步或多步实现AD转换的叫做分级(Multistep/Subrangling)型AD,而从转换时序角度又可称为流水线(Pipelined)型AD,现代的分级型AD中还加入了对多次转换结果作数字运算而修正特性等功能。这类AD速度比逐次比较型高,电路 规模比并行型小。 | + | * 并行比较型/串并行比较型:并行比较型AD采用多个比较器,仅作一次比较而实行转换,又称FLash(快速)型。由于转换速率极高,n位的转换需要2n-1个比较器,因此电路规模也极大,价格也高,只适用于视频AD转换器等速度特别高的领域。串并行比较型AD结构上介于并行型和逐次比较型之间,最典型的是由2个n/2位的并行型AD转换器配合DA转换器组成,用两次比较实行转换,所以称为 Half flash(半快速)型。还有分成三步或多步实现AD转换的叫做分级(Multistep/Subrangling)型AD,而从转换时序角度又可称为流水线(Pipelined)型AD,现代的分级型AD中还加入了对多次转换结果作数字运算而修正特性等功能。这类AD速度比逐次比较型高,电路 规模比并行型小。 |
* Σ-Δ(Sigma delta)调制型:Σ-Δ型AD由积分器、比较器、1位DA转换器和数字滤波器等组成。原理上近似于积分型,将输入电压转换成时间(脉冲宽度)信号,用数字滤波器处理后得到数字值。电路的数字部分基本上容易单片化,因此容易做到高分辨率。主要用于音频和测量。 | * Σ-Δ(Sigma delta)调制型:Σ-Δ型AD由积分器、比较器、1位DA转换器和数字滤波器等组成。原理上近似于积分型,将输入电压转换成时间(脉冲宽度)信号,用数字滤波器处理后得到数字值。电路的数字部分基本上容易单片化,因此容易做到高分辨率。主要用于音频和测量。 | ||
* 电容阵列逐次比较型:电容阵列逐次比较型AD在内置DA转换器中采用电容矩阵方式,也可称为电荷再分配型。一般的电阻阵列DA转换器中多数电阻的值必须一致,在单芯片上生成高 精度的电阻并不容易。如果用电容阵列取代电阻阵列,可以用低廉成本制成高精度单片AD转换器。最近的逐次比较型AD转换器大多为电容阵列式的。 | * 电容阵列逐次比较型:电容阵列逐次比较型AD在内置DA转换器中采用电容矩阵方式,也可称为电荷再分配型。一般的电阻阵列DA转换器中多数电阻的值必须一致,在单芯片上生成高 精度的电阻并不容易。如果用电容阵列取代电阻阵列,可以用低廉成本制成高精度单片AD转换器。最近的逐次比较型AD转换器大多为电容阵列式的。 | ||
* 压频变换型:压频变换型(Voltage-Frequency Converter)是通过间接转换方式实现模数转换的。其原理是首先将输入的模拟信号转换成频率,然 后用计数器将频率转换成数字量。从理论上讲这种AD的分辨率几乎可以无限增加,只要采样的时间能够满足输出频率分辨率要求的累积脉冲个数的宽度。其优点是分辨率高、功耗低、价格低,但是需要外部计数电路共同完成AD转换。 | * 压频变换型:压频变换型(Voltage-Frequency Converter)是通过间接转换方式实现模数转换的。其原理是首先将输入的模拟信号转换成频率,然 后用计数器将频率转换成数字量。从理论上讲这种AD的分辨率几乎可以无限增加,只要采样的时间能够满足输出频率分辨率要求的累积脉冲个数的宽度。其优点是分辨率高、功耗低、价格低,但是需要外部计数电路共同完成AD转换。 | ||
+ | |||
* **ADC主要参数介绍** | * **ADC主要参数介绍** | ||
* ADC主要参数有以下几点: | * ADC主要参数有以下几点: | ||
行 283: | 行 285: | ||
* 满刻度误差:满度输出时对应的输入信号与理想输入信号值之差。 | * 满刻度误差:满度输出时对应的输入信号与理想输入信号值之差。 | ||
* 线性度:实际转换器的转移函数与理想直线的最大偏移。 | * 线性度:实际转换器的转移函数与理想直线的最大偏移。 | ||
+ | |||
* **STM32H750 ADC介绍** | * **STM32H750 ADC介绍** | ||
* STM32H750xx系列有3个ADC,都可以独立工作,其中ADC1和ADC2还可以组成双重模式(提高采样率)。STM32H750的ADC分辨率高达16位,每个ADC具有多达20个的采集通道,这些通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右对齐方式存储在32位数据寄存器中。 | * STM32H750xx系列有3个ADC,都可以独立工作,其中ADC1和ADC2还可以组成双重模式(提高采样率)。STM32H750的ADC分辨率高达16位,每个ADC具有多达20个的采集通道,这些通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右对齐方式存储在32位数据寄存器中。 | ||
行 294: | 行 297: | ||
* 74HC4051主要应用于模拟多路选择开关、数字多路选择开关及信号选通。 | * 74HC4051主要应用于模拟多路选择开关、数字多路选择开关及信号选通。 | ||
* 逻辑图: | * 逻辑图: | ||
- | {{ :icore4tx:icore4tx_arm_hal_56_29.png?direct&800 |}} | ||
- | * 功能说明: | ||
{{ :icore4tx:icore4tx_arm_hal_56_30.png?direct&800 |}} | {{ :icore4tx:icore4tx_arm_hal_56_30.png?direct&800 |}} | ||
+ | * 功能说明: | ||
+ | {{ :icore4tx:icore4tx_arm_hal_56_31.png?direct&800 |}} | ||
* 在本实验中,我们的计算机通过转接模块连接iCore4T的RS-485,通过Modbus Poll软件获得iCore4T的电源电压和温度信息。 | * 在本实验中,我们的计算机通过转接模块连接iCore4T的RS-485,通过Modbus Poll软件获得iCore4T的电源电压和温度信息。 | ||
* 原理图: | * 原理图: | ||
- | {{ :icore4tx:icore4tx_arm_hal_56_31.png?direct&800 |}} | ||
{{ :icore4tx:icore4tx_arm_hal_56_32.png?direct&800 |}} | {{ :icore4tx:icore4tx_arm_hal_56_32.png?direct&800 |}} | ||
- | ==== 实验程序 ==== | + | {{ :icore4tx:icore4tx_arm_hal_56_33.png?direct&800 |}} |
+ | ==== 四、实验程序 ==== | ||
=== 1.主函数 === | === 1.主函数 === | ||
行 312: | 行 315: | ||
int i; | int i; | ||
unsigned short int temp[10] = {0}; | unsigned short int temp[10] = {0}; | ||
- | HAL_Init(); | + | HAL_Init(); |
- | SystemClock_Config(); | + | SystemClock_Config(); |
i2c.initialize(); | i2c.initialize(); | ||
axp152.initialize(); | axp152.initialize(); | ||
行 328: | 行 331: | ||
- | MX_GPIO_Init(); | + | MX_GPIO_Init(); |
- | MX_USART1_UART_Init(); | + | MX_USART1_UART_Init(); |
- | MX_ADC1_Init(); | + | MX_ADC1_Init(); |
- | MX_ADC3_Init(); | + | MX_ADC3_Init(); |
usart1.initialize(115200); | usart1.initialize(115200); | ||
行 519: | 行 522: | ||
</code> | </code> | ||
=== 3.74HC4051通道配置 === | === 3.74HC4051通道配置 === | ||
+ | <code c> | ||
+ | //定义74HC4051片选管脚 | ||
+ | #define SEL_A_ON HAL_GPIO_WritePin(GPIOI, SEL_A_Pin, GPIO_PIN_SET) | ||
+ | #define SEL_A_OFF HAL_GPIO_WritePin(GPIOI, SEL_A_Pin, GPIO_PIN_RESET) | ||
+ | #define SEL_B_ON HAL_GPIO_WritePin(GPIOI, SEL_B_Pin, GPIO_PIN_SET) | ||
+ | #define SEL_B_OFF HAL_GPIO_WritePin(GPIOI, SEL_B_Pin, GPIO_PIN_RESET) | ||
+ | |||
+ | #define SEL_C_ON HAL_GPIO_WritePin(GPIOI, SEL_C_Pin, GPIO_PIN_SET) | ||
+ | #define SEL_C_OFF HAL_GPIO_WritePin(GPIOI, SEL_C_Pin, GPIO_PIN_RESET) | ||
+ | //选择测量BK4时片选脚状态 | ||
+ | #define CHANNEL_0_ON SEL_C_OFF;\ | ||
+ | SEL_B_OFF;\ | ||
+ | SEL_A_OFF | ||
+ | //选择测量BK3时片选脚状态 | ||
+ | #define CHANNEL_1_ON SEL_C_OFF;\ | ||
+ | SEL_B_OFF;\ | ||
+ | SEL_A_ON | ||
+ | //选择测量BK5时片选脚状态 | ||
+ | #define CHANNEL_2_ON SEL_C_OFF;\ | ||
+ | SEL_B_ON;\ | ||
+ | SEL_A_OFF | ||
+ | //选择测量2.5V时片选脚状态 | ||
+ | #define CHANNEL_3_ON SEL_C_OFF;\ | ||
+ | SEL_B_ON;\ | ||
+ | SEL_A_ON | ||
+ | //选择测量输入电流时片选脚状态 | ||
+ | #define CHANNEL_4_ON SEL_C_ON;\ | ||
+ | SEL_B_OFF;\ | ||
+ | SEL_A_OFF | ||
+ | //选择测量1.2V时片选脚状态 | ||
+ | #define CHANNEL_5_ON SEL_C_ON;\ | ||
+ | SEL_B_OFF;\ | ||
+ | SEL_A_ON | ||
+ | //选择测量3.3V时片选脚状态 | ||
+ | #define CHANNEL_6_ON SEL_C_ON;\ | ||
+ | SEL_B_ON;\ | ||
+ | SEL_A_OFF | ||
+ | //选择测量BK7时片选脚状态 | ||
+ | #define CHANNEL_7_ON SEL_C_ON;\ | ||
+ | SEL_B_ON;\ | ||
+ | SEL_A_ON | ||
+ | |||
+ | |||
+ | </code> | ||
=== 4.ADC初始化函数 === | === 4.ADC初始化函数 === | ||
+ | <code c> | ||
+ | void MX_ADC1_Init(void) | ||
+ | { | ||
+ | ADC_MultiModeTypeDef multimode = {0}; | ||
+ | ADC_ChannelConfTypeDef sConfig = {0}; | ||
+ | hadc1.Instance = ADC1; | ||
+ | hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV16; //16分频 | ||
+ | hadc1.Init.Resolution = ADC_RESOLUTION_16B; //ADC转换分辨率16位 | ||
+ | hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; //非扫描模式 | ||
+ | hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV; //关闭 EOC 中断 | ||
+ | hadc1.Init.LowPowerAutoWait = DISABLE; //自动低功耗关闭 | ||
+ | hadc1.Init.ContinuousConvMode = DISABLE; //关闭连续转换 | ||
+ | hadc1.Init.NbrOfConversion = 1; //1个转换在规则序列中 | ||
+ | hadc1.Init.DiscontinuousConvMode = DISABLE; //禁止不连续采样模式 | ||
+ | hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; //软件触发 | ||
+ | hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; //禁止触发检测 | ||
+ | hadc1.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DR; //存到DR寄存器 | ||
+ | hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED; //溢出保留上次转换数据 | ||
+ | hadc1.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE; //位数不左移 | ||
+ | hadc1.Init.OversamplingMode = DISABLE; //关闭过采样 | ||
+ | if (HAL_ADC_Init(&hadc1) != HAL_OK) | ||
+ | { | ||
+ | Error_Handler(); | ||
+ | } | ||
+ | multimode.Mode = ADC_MODE_INDEPENDENT; //独立模式 | ||
+ | if (HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode) != HAL_OK) | ||
+ | { | ||
+ | Error_Handler(); | ||
+ | } | ||
+ | sConfig.Channel = ADC_CHANNEL_16; //通道16 | ||
+ | sConfig.Rank = ADC_REGULAR_RANK_1; //第 1 个序列 | ||
+ | sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5; //采样时间 | ||
+ | sConfig.SingleDiff = ADC_SINGLE_ENDED; //单端输入 | ||
+ | sConfig.OffsetNumber = ADC_OFFSET_NONE; //不选择偏移序号 | ||
+ | sConfig.Offset = 0; | ||
+ | if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) | ||
+ | { | ||
+ | Error_Handler(); | ||
+ | } | ||
+ | void MX_ADC3_Init(void) | ||
+ | { | ||
+ | ADC_ChannelConfTypeDef sConfig = {0}; | ||
+ | hadc3.Instance = ADC3; | ||
+ | hadc3.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV16; | ||
+ | hadc3.Init.Resolution = ADC_RESOLUTION_16B; | ||
+ | hadc3.Init.ScanConvMode = ADC_SCAN_DISABLE; | ||
+ | hadc3.Init.EOCSelection = ADC_EOC_SINGLE_CONV; | ||
+ | hadc3.Init.LowPowerAutoWait = DISABLE; | ||
+ | hadc3.Init.ContinuousConvMode = DISABLE; | ||
+ | hadc3.Init.NbrOfConversion = 1; | ||
+ | hadc3.Init.DiscontinuousConvMode = DISABLE; | ||
+ | hadc3.Init.ExternalTrigConv = ADC_SOFTWARE_START; | ||
+ | hadc3.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; | ||
+ | hadc3.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DR; | ||
+ | hadc3.Init.Overrun = ADC_OVR_DATA_PRESERVED; | ||
+ | hadc3.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE; | ||
+ | hadc3.Init.OversamplingMode = DISABLE; | ||
+ | if (HAL_ADC_Init(&hadc3) != HAL_OK) | ||
+ | { | ||
+ | Error_Handler(); | ||
+ | } | ||
+ | sConfig.Channel = ADC_CHANNEL_1; | ||
+ | sConfig.Rank = ADC_REGULAR_RANK_1; | ||
+ | sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5; | ||
+ | sConfig.SingleDiff = ADC_SINGLE_ENDED; | ||
+ | sConfig.OffsetNumber = ADC_OFFSET_NONE; | ||
+ | sConfig.Offset = 0; | ||
+ | if (HAL_ADC_ConfigChannel(&hadc3, &sConfig) != HAL_OK) | ||
+ | { | ||
+ | Error_Handler(); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | |||
+ | </code> | ||
=== 5.ADC读取函数 === | === 5.ADC读取函数 === | ||
+ | <code c> | ||
+ | void sort(unsigned short int a[], int n) | ||
+ | { | ||
+ | int i, j, t; | ||
+ | | ||
+ | //元素从小到大排列 | ||
+ | for (i = 0; i < n - 1; i++) { | ||
+ | for (j = 0; j < n - i - 1; j++) { | ||
+ | if (a[j] > a[j + 1]) { | ||
+ | t = a[j]; | ||
+ | a[j] = a[j + 1]; | ||
+ | a[j + 1] = t; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | int read(int channel) | ||
+ | { | ||
+ | int i; | ||
+ | unsigned long int temp = 0; | ||
+ | unsigned short int data[50]; | ||
+ | ADC_ChannelConfTypeDef channel_config; | ||
+ | int channel_remap[2] = {ADC_CHANNEL_16,ADC_CHANNEL_1};//ADC1,16通道 | ||
+ | | ||
+ | channel_config.Channel = channel_remap[channel]; //通道选择 | ||
+ | channel_config.Offset = 0; //偏移量为0 | ||
+ | channel_config.Rank = ADC_REGULAR_RANK_1; //第一个序列 | ||
+ | channel_config.SamplingTime = ADC_SAMPLETIME_1CYCLE_5; //采样时间 | ||
+ | channel_config.SingleDiff = ADC_SINGLE_ENDED; //单端输入 | ||
+ | channel_config.OffsetNumber = ADC_OFFSET_NONE; //不选择偏移序号 | ||
+ | | ||
+ | for(i = 0;i < 50;i ++){ | ||
+ | if(channel == 0){ //如果通道为0,则使能ADC1 | ||
+ | HAL_ADC_ConfigChannel(&hadc1,&channel_config); | ||
+ | HAL_ADC_Start(&hadc1); | ||
+ | while(!__HAL_ADC_GET_FLAG(&hadc1,ADC_FLAG_EOC)); | ||
+ | data[i] = HAL_ADC_GetValue(&hadc1); | ||
+ | }else if(channel == 1){ //如果通道为1,则使能ADC3 | ||
+ | HAL_ADC_ConfigChannel(&hadc3,&channel_config); | ||
+ | HAL_ADC_Start(&hadc3); | ||
+ | while(!__HAL_ADC_GET_FLAG(&hadc3,ADC_FLAG_EOC)); | ||
+ | data[i] = HAL_ADC_GetValue(&hadc3); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | sort(data,50); | ||
+ | for(i = 20;i < 30;i++){ //取ADC排序后的中间10位数值 | ||
+ | temp += data[i]; | ||
+ | } | ||
+ | |||
+ | temp = temp / 10; //取ADC平均值 | ||
+ | if(channel == 0){ //读取ADC1的值 | ||
+ | my_adc.value[channel] = temp * ADC_REF / 65536; | ||
+ | } | ||
+ | | ||
+ | return temp; | ||
+ | } | ||
+ | |||
+ | static int read_mux(void) | ||
+ | { //打开通道并读取ADC的值 | ||
+ | CHANNEL_0_ON; | ||
+ | my_adc.value[1] = my_adc.read(1) * ADC_REF / 65536; | ||
+ | | ||
+ | CHANNEL_1_ON; | ||
+ | my_adc.value[2] = my_adc.read(1) * ADC_REF / 65536; | ||
+ | | ||
+ | CHANNEL_2_ON; | ||
+ | my_adc.value[3] = my_adc.read(1) * ADC_REF / 65536; | ||
+ | | ||
+ | CHANNEL_3_ON; | ||
+ | my_adc.value[4] = my_adc.read(1) * ADC_REF / 65536; | ||
+ | | ||
+ | CHANNEL_4_ON; | ||
+ | my_adc.value[5] = my_adc.read(1) * ADC_REF / 65536; | ||
+ | | ||
+ | CHANNEL_5_ON; | ||
+ | my_adc.value[6] = my_adc.read(1) * ADC_REF / 65536; | ||
+ | | ||
+ | CHANNEL_6_ON; | ||
+ | my_adc.value[7] = my_adc.read(1) * ADC_REF / 65536; | ||
+ | | ||
+ | CHANNEL_7_ON; | ||
+ | my_adc.value[8] = my_adc.read(1) * ADC_REF / 65536; | ||
+ | | ||
+ | return 0; | ||
+ | } | ||
+ | |||
+ | |||
+ | </code> | ||
行 539: | 行 750: | ||
==== 六.实验现象 ==== | ==== 六.实验现象 ==== | ||
* 通过Modbus Poll软件获得iCore4TX的电源电压和温度信息。 | * 通过Modbus Poll软件获得iCore4TX的电源电压和温度信息。 | ||
- | + | {{ :icore4tx:icore4tx_arm_hal_56_34.png?direct&10000 |}} | |
行 564: | 行 775: | ||
2、打开 Modbus Poll,点击 Connection connect,输入 SN.txt 中的序列号。 | 2、打开 Modbus Poll,点击 Connection connect,输入 SN.txt 中的序列号。 | ||
- | + | {{ :icore4tx:icore4tx_arm_hal_56_35.png?direct&800 |}} | |
3、按下图进行设置,点击 OK 即可。 | 3、按下图进行设置,点击 OK 即可。 | ||
- | + | {{ :icore4tx:icore4tx_arm_hal_56_36.png?direct&600 |}} | |