no message

This commit is contained in:
dufresne 2025-09-16 17:20:37 +08:00
parent 677a98b84f
commit fb0726f7e9
6 changed files with 239 additions and 84 deletions

View File

@ -357,9 +357,9 @@
<state>$PROJ_DIR$\..\rtthread</state> <state>$PROJ_DIR$\..\rtthread</state>
<state>$PROJ_DIR$\..\rtthread\include\libc</state> <state>$PROJ_DIR$\..\rtthread\include\libc</state>
<state>$PROJ_DIR$\..\rtthread\include</state> <state>$PROJ_DIR$\..\rtthread\include</state>
<state>D:\git\newPtz\drivers</state> <state>D:\newPtz\drivers</state>
<state>D:\git\newPtz\drivers\tmp75</state> <state>D:\newPtz\drivers\mb85rc64</state>
<state>D:\git\newPtz\drivers\mb85rc64</state> <state>D:\newPtz\drivers\tmp75</state>
</option> </option>
<option> <option>
<name>CCStdIncCheck</name> <name>CCStdIncCheck</name>
@ -2205,12 +2205,18 @@
<file> <file>
<name>$PROJ_DIR$\..\drivers\mb85rc64\mb85rc64.c</name> <name>$PROJ_DIR$\..\drivers\mb85rc64\mb85rc64.c</name>
</file> </file>
<file>
<name>$PROJ_DIR$\..\drivers\mb85rc64\mb85rc64.h</name>
</file>
</group> </group>
<group> <group>
<name>tmp75</name> <name>tmp75</name>
<file> <file>
<name>$PROJ_DIR$\..\drivers\tmp75\tmp75.c</name> <name>$PROJ_DIR$\..\drivers\tmp75\tmp75.c</name>
</file> </file>
<file>
<name>$PROJ_DIR$\..\drivers\tmp75\tmp75.h</name>
</file>
</group> </group>
<file> <file>
<name>$PROJ_DIR$\..\drivers\delay_us.c</name> <name>$PROJ_DIR$\..\drivers\delay_us.c</name>

View File

@ -2876,12 +2876,18 @@
<file> <file>
<name>$PROJ_DIR$\..\drivers\mb85rc64\mb85rc64.c</name> <name>$PROJ_DIR$\..\drivers\mb85rc64\mb85rc64.c</name>
</file> </file>
<file>
<name>$PROJ_DIR$\..\drivers\mb85rc64\mb85rc64.h</name>
</file>
</group> </group>
<group> <group>
<name>tmp75</name> <name>tmp75</name>
<file> <file>
<name>$PROJ_DIR$\..\drivers\tmp75\tmp75.c</name> <name>$PROJ_DIR$\..\drivers\tmp75\tmp75.c</name>
</file> </file>
<file>
<name>$PROJ_DIR$\..\drivers\tmp75\tmp75.h</name>
</file>
</group> </group>
<file> <file>
<name>$PROJ_DIR$\..\drivers\delay_us.c</name> <name>$PROJ_DIR$\..\drivers\delay_us.c</name>

View File

@ -49,6 +49,13 @@ float adc_value;
float tmp; float tmp;
char tiedian_id[3]={0}; char tiedian_id[3]={0};
uint16_t tmp_value = 0;
extern uint16_t USER_ADC_DMA_DATA_BUFF;//bsp_adc.c中定义的ADC数据接收数组
uint8_t g_ADCDataReady=0;//DMA传输完成ADC数据标志位
typedef struct _MB85TEST_ typedef struct _MB85TEST_
{ {
char ttt; char ttt;
@ -73,32 +80,58 @@ int main(void)
gd32_usart_init(); gd32_usart_init();
adc_config(); adc_init();
temp75_gpio_init(); temp75_gpio_init();
//测试mb铁电读写 //测试mb铁电读写
memset(&ttest, 0, sizeof(ttest)); memset(&ttest, 0, sizeof(ttest));
// mb85rc64_page_write(); // mb85rc64_page_write();
mb85rc64_add_read(MB85TEST_ADD, (unsigned char *)&ttest, sizeof(ttest)); mb85rc64_add_read(MB85TEST_ADD, (unsigned char *)&ttest, sizeof(ttest));
ttest.ttt += 3; ttest.ttt += 3;
ttest.ggg /= 18; if (ttest.ggg >= 1000)
{
ttest.ggg -= 2;
ttest.ggg /= 3;
}
else
{
ttest.ggg += 2;
ttest.ggg *= 3;
}
mb85rc64_page_write(MB85TEST_ADD, (unsigned char *)&ttest, sizeof(ttest)); mb85rc64_page_write(MB85TEST_ADD, (unsigned char *)&ttest, sizeof(ttest));
// 进入主循环或启动其他任务 // 进入主循环或启动其他任务
while (1) while (1)
{ {
voltage = ptz_Voltage_collect_adc1_task(); if(SET == g_ADCDataReady)
{
// current_origin = current*0.132 + 3.3/2; g_ADCDataReady = RESET;
for(uint8_t i=0; i<CHANNEL_LENGTH; i++)
{
tmp_value = BSP_ADCDataAcquire(i);
if (i == 0)
{
voltage = tmp_value/ 4095.0 * 3.3;
}
else
{
current = tmp_value/ 4095.0 * 3.3;
}
}
}
rt_thread_mdelay(500); rt_thread_mdelay(500);
current = ptz_Current_collect_adc1_task();
rt_thread_mdelay(500); // voltage = ptz_Voltage_collect_adc1_task();
// rt_thread_mdelay(250);
// current = ptz_Current_collect_adc1_task();
// rt_thread_mdelay(250);
tmp = ptz_temperature_collect_tmp75_task(); tmp = ptz_temperature_collect_tmp75_task();
@ -108,7 +141,25 @@ int main(void)
memset(&ttest, 0, sizeof(ttest)); memset(&ttest, 0, sizeof(ttest));
// mb85rc64_page_write(); // mb85rc64_page_write();
mb85rc64_add_read(MB85TEST_ADD, (unsigned char *)&ttest, sizeof(ttest)); mb85rc64_add_read(MB85TEST_ADD, (unsigned char *)&ttest, sizeof(ttest));
usart_puts(ttest.ttt); // usart_puts(ttest.ttt);
// 主循环代码... // 主循环代码...
} }
} }
/*
*****************************************************************************
* : DMA_ADCIRQHandlerCallback
* : DMA_ADC中断服务回调函数
* :
* :
*****************************************************************************
*/
void DMA_ADCIRQHandlerCallback(void)
{
if(SET == dma_interrupt_flag_get(DMA1,USER_DMA_ADC_CHANNEL,DMA_INTC_FTFIFC))
{
dma_interrupt_flag_clear(DMA1,USER_DMA_ADC_CHANNEL,DMA_INTC_FTFIFC);
dma_channel_disable(DMA1, USER_DMA_ADC_CHANNEL);
g_ADCDataReady = SET;
}
}

View File

@ -12,75 +12,130 @@
***********************************************************/ ***********************************************************/
#include "drv_adc.h" #include "drv_adc.h"
#include "tmp75.h"
#include "stdlib.h" /*全局声明区*/
#include "string.h" uint16_t USER_ADC_DMA_DATA_BUFF[16] = {0};
#include "gd32f4xx.h"
#include "gd32f4xx_adc.h"
// #include "gd32f4xx_dma.h"
#include "rtthread.h"
void adc_config(void) void adc_init(void)
{
adc_rcu_config();
adc_gpio_config();
adc_dma_config();
adc_config();
}
/* 时钟+GPIO */
void adc_rcu_config(void)
{ {
/* 启用GPIOC时钟 */
rcu_periph_clock_enable(RCU_GPIOC);
/* 启用ADC1时钟 */ /* 启用ADC1时钟 */
rcu_periph_clock_enable(RCU_ADC1); rcu_periph_clock_enable(RCU_ADC1);
/* peripheral clock enable */
rcu_periph_clock_enable(RCU_DMA1);//ADC只能用DMA1
// 复位ADC配置可选但建议初始化时做一次 /* 启用GPIOC时钟 */
adc_deinit(); rcu_periph_clock_enable(RCU_GPIOC);
// adc_clock_config(ADC_ADCCK_PCLK2_DIV4);
// 开启ADC
adc_enable(ADCX);
// 等待ADC稳定
rt_thread_mdelay(100);
// 执行ADC自校准
adc_calibration_enable(ADCX);
adc_clock_config(ADC_ADCCK_PCLK2_DIV4); adc_clock_config(ADC_ADCCK_PCLK2_DIV4);
}
void adc_gpio_config(void)
{
/* 配置ADC引脚为模拟输入模式 */ /* 配置ADC引脚为模拟输入模式 */
gpio_mode_set(ADC_GPIO_PORT, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, VOLTAGE_ADC_PIN); gpio_mode_set(ADC_GPIO_PORT, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, VOLTAGE_ADC_PIN);
gpio_mode_set(ADC_GPIO_PORT, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, CURRENT_ADC_PIN); gpio_mode_set(ADC_GPIO_PORT, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, CURRENT_ADC_PIN);
// 配置数据对齐方式为右对齐
adc_data_alignment_config(ADCX, ADC_DATAALIGN_RIGHT);
// 配置ADC分辨率12位
adc_resolution_config(ADCX, ADC_RESOLUTION_12B);
// 打开扫描模式
adc_special_function_config(ADCX, ADC_SCAN_MODE, ENABLE);
// 禁止连续模式 -> 单次转换模式
adc_special_function_config(ADCX, ADC_CONTINUOUS_MODE, DISABLE);
/* ########## 设置转换通道序列 ########## */
// 配置规则序列的长度1个通道
adc_channel_length_config(ADCX, ADC_ROUTINE_CHANNEL, ADC_CHANNEL_NUM);
} }
/* DMA配置 */
static void adc_dma_config(void)
{
/* ADC_DMA_channel configuration */
dma_single_data_parameter_struct dma_single_data_parameter; //这里使用单数据模式,每次只传输一个数据单元,因为总数据量不大,且数据个数不固定
/* ADC DMA_channel configuration */
dma_deinit(DMA1, USER_DMA_ADC_CHANNEL);
/* initialize DMA single data mode */
dma_single_data_parameter.periph_addr = (uint32_t)(&ADC_RDATA(ADCX));//配置外设数据源地址宏决定ADCx
dma_single_data_parameter.periph_inc = DMA_PERIPH_INCREASE_DISABLE;//关闭外设增量,只需要每次对该数据源寄存器访问
dma_single_data_parameter.memory0_addr = (uint32_t)USER_ADC_DMA_DATA_BUFF;//先写死然后外部用的话需要extern
dma_single_data_parameter.memory_inc = DMA_MEMORY_INCREASE_ENABLE;//开启内存增量以存放不同通道的ADC数据
dma_single_data_parameter.periph_memory_width = DMA_PERIPH_WIDTH_16BIT;//ADC数据为16位的寄存器数据目的地为16位
dma_single_data_parameter.circular_mode = DMA_CIRCULAR_MODE_ENABLE;//循环模式由ADC通知DMA进行
/* DMA外设到内存模式不开启 */
dma_single_data_parameter.direction = DMA_PERIPH_TO_MEMORY;//ADC外设到RAM全局变量
dma_single_data_parameter.number = CHANNEL_LENGTH;//宏决定传输个数
dma_single_data_parameter.priority = DMA_PRIORITY_ULTRA_HIGH;//优先级设为超高,可改用宏
dma_single_data_mode_init(DMA1, USER_DMA_ADC_CHANNEL, &dma_single_data_parameter);
/* 配置 dma 子连接 */
dma_channel_subperipheral_select(DMA1, USER_DMA_ADC_CHANNEL, USER_DMA_ADC_SUBPERI);
/* enable DMA circulation mode */
dma_circulation_enable(DMA1, USER_DMA_ADC_CHANNEL);// 开启循环模式
/* enable DMA channel */
dma_channel_enable(DMA1, USER_DMA_ADC_CHANNEL);
/* enable DMA it */
dma_interrupt_enable(DMA1,USER_DMA_ADC_CHANNEL,DMA_INT_FTF);//DMA传输完成标志位 打开全部完成中断
nvic_irq_enable(DMA_ADC_IRQn, DMA_ADC_PRIORITY_PRE, DMA_ADC_PRIORITY_SUB);
}
void adc_config(void)
{
adc_deinit();// 复位ADC配置可选但建议初始化时做一次
adc_special_function_config(ADCX, ADC_SCAN_MODE, SCAN_STATUS);// 打开扫描模式
adc_special_function_config(ADCX, ADC_CONTINUOUS_MODE, CONTINUOUS_STATUS);// 禁止连续模式 -> 单次转换模式
adc_data_alignment_config(ADCX, ADC_DATAALIGN_RIGHT);// 配置数据对齐方式为右对齐
adc_resolution_config(ADCX, ADC_RESOLUTION_12B);// 配置ADC分辨率12位
/* 设置转换通道序列 */
adc_channel_length_config(ADCX, SEQUENCE_CHANNEL, CHANNEL_LENGTH);// 配置规则序列的长度2个通道
adc_routine_channel_config(ADCX, 0, VOLTAGE_ADC_CHANNEL, ADC_SAMPLETIME_480);
adc_routine_channel_config(ADCX, 1, CURRENT_ADC_CHANNEL, ADC_SAMPLETIME_480);
/* 使能外部触发:这里使用软件触发,所以先禁用硬件触发 */
adc_external_trigger_source_config(ADCX, SEQUENCE_CHANNEL, ADC_EXTTRIG_ROUTINE_T0_CH0);
adc_external_trigger_config(ADCX, SEQUENCE_CHANNEL, DISABLE);
/* ADC dma config */
adc_dma_request_after_last_enable(ADCX);
adc_dma_mode_enable(ADCX);
adc_enable(ADCX);// 开启ADC
rt_thread_mdelay(50);// 等待ADC稳定后续接校准
adc_calibration_enable(ADCX);// 执行ADC自校准
adc_software_trigger_enable(ADCX, SEQUENCE_CHANNEL);// 软件触发使能 后续接读取
}
/**
* @brief ADC测量值
* @param ADC通道结构体中的成员序号
* @return
*/
uint16_t BSP_ADCDataAcquire(uint8_t _index)
{
return USER_ADC_DMA_DATA_BUFF[_index];
}
/* ---------------------------------------------------------------------------------------------------------------- */
// adc电压采集 // adc电压采集
float ptz_Voltage_collect_adc1_task() float ptz_Voltage_collect_adc1_task()
{ {
// 配置规则序列序号0是电压通道序号1是电流通道
adc_routine_channel_config(ADCX, 0, VOLTAGE_ADC_CHANNEL, ADC_SAMPLETIME_480);
// 使能外部触发:这里使用软件触发,所以先禁用硬件触发
adc_external_trigger_config(ADCX, ADC_ROUTINE_CHANNEL, DISABLE);
// 软件触发使能
adc_software_trigger_enable(ADCX, ADC_ROUTINE_CHANNEL);
static float adc1_v[LB_V_TIMES]; static float adc1_v[LB_V_TIMES];
static float curadc1_out_v; static float curadc1_out_v;
static uint8_t adc1_v_num; static uint8_t adc1_v_num;
@ -89,11 +144,13 @@ float ptz_Voltage_collect_adc1_task()
float curadc1; float curadc1;
uint16_t value_V = 0; uint16_t value_V = 0;
/* 配置规则序列序号0是电压通道序号1是电流通道 */
adc_routine_channel_config(ADCX, 0, VOLTAGE_ADC_CHANNEL, ADC_SAMPLETIME_480);
adc_software_trigger_enable(ADCX, SEQUENCE_CHANNEL);// 软件触发使能 后续接读取
while(adc_flag_get(ADCX, ADC_FLAG_EOC) == RESET); // 等待转换结束 while(adc_flag_get(ADCX, ADC_FLAG_EOC) == RESET); // 等待转换结束
value_V = adc_routine_data_read(ADCX); // 读取规则组数据寄存器 value_V = adc_routine_data_read(ADCX); // 读取规则组数据寄存器
/* 间接测量11倍分压/放大 */ /* 间接测量11倍分压/放大 */
adc1_v[adc1_v_num] = (float)value_V / 4095.0 * 3.3; adc1_v[adc1_v_num] = (float)value_V / 4095.0 * 3.3;
@ -129,15 +186,6 @@ float ptz_Voltage_collect_adc1_task()
// adc电流采集 // adc电流采集
float ptz_Current_collect_adc1_task() float ptz_Current_collect_adc1_task()
{ {
// 配置规则序列序号0是电压通道序号1是电流通道
adc_routine_channel_config(ADCX, 0, CURRENT_ADC_CHANNEL, ADC_SAMPLETIME_480);
// 使能外部触发:这里使用软件触发,所以先禁用硬件触发
adc_external_trigger_config(ADCX, ADC_ROUTINE_CHANNEL, DISABLE);
// 软件触发使能
adc_software_trigger_enable(ADCX, ADC_ROUTINE_CHANNEL);
static float adc1_i[LB_I_TIMES]; static float adc1_i[LB_I_TIMES];
static float curadc1_out_i; static float curadc1_out_i;
static uint8_t adc1_i_num; static uint8_t adc1_i_num;
@ -146,7 +194,11 @@ float ptz_Current_collect_adc1_task()
float curadc1; float curadc1;
uint16_t value_I = 0; uint16_t value_I = 0;
while(adc_flag_get(ADCX, ADC_FLAG_EOC) == RESET); // 等待转换结束 // 配置规则序列序号0是电压通道序号1是电流通道
adc_routine_channel_config(ADCX, 0, CURRENT_ADC_CHANNEL, ADC_SAMPLETIME_480);
adc_software_trigger_enable(ADCX, SEQUENCE_CHANNEL);// 软件触发使能 后续接读取
while(adc_flag_get(ADCX, ADC_FLAG_EOC) == RESET); // 等待转换结束->等到SET
value_I = adc_routine_data_read(ADCX); // 读取规则组数据寄存器 value_I = adc_routine_data_read(ADCX); // 读取规则组数据寄存器
/* 间接测量11倍分压/放大 */ /* 间接测量11倍分压/放大 */

View File

@ -1,6 +1,14 @@
#ifndef __DRV_ADC_H_ #ifndef __DRV_ADC_H_
#define __DRV_ADC_H_ #define __DRV_ADC_H_
#include "tmp75.h"
#include "stdlib.h"
#include "string.h"
#include "gd32f4xx.h"
#include "gd32f4xx_adc.h"
#include "gd32f4xx_dma.h"
#include "rtthread.h"
/* 自定义宏,方便修改通道和引脚 */ /* 自定义宏,方便修改通道和引脚 */
#define ADCX ADC1 #define ADCX ADC1
#define VOLTAGE_ADC_CHANNEL ADC_CHANNEL_12 #define VOLTAGE_ADC_CHANNEL ADC_CHANNEL_12
@ -8,11 +16,43 @@
#define ADC_GPIO_PORT GPIOC #define ADC_GPIO_PORT GPIOC
#define VOLTAGE_ADC_PIN GPIO_PIN_2 #define VOLTAGE_ADC_PIN GPIO_PIN_2
#define CURRENT_ADC_PIN GPIO_PIN_3 #define CURRENT_ADC_PIN GPIO_PIN_3
#define ADC_CHANNEL_NUM 1 // 规则组配置规则序列的通道2个通道 #define LB_V_TIMES 7 //电压采样滤波次数
#define LB_V_TIMES 7 #define LB_I_TIMES 12 //电流采样滤波次数
#define LB_I_TIMES 12 #define LB_T_TIMES 7 //温度采样滤波次数
#define LB_T_TIMES 7
/*
adc模式配置参数
ENABLE
DISABLE
*/
#define CONTINUOUS_STATUS ENABLE// 是否开启连续转换
#define SEQUENCE_CHANNEL ADC_ROUTINE_CHANNEL// 注入组还是规则组
#define SCAN_STATUS ENABLE// 是否开启扫描模式
#define DMA_STATUS ENABLE// 是否开启dma
#define CHANNEL_LENGTH 2// 通道数量:1~16
/* adc dma */
#define USER_DMA_ADC_CHANNEL DMA_CH3 //DMA通道ADC0:DMA_CH0 DMA_CH4
// ADC1:DMA_CH2 DMA_CH3
// ADC2:DMA_CH0 DMA_CH3
#define USER_DMA_ADC_SUBPERI DMA_SUBPERI1 //DMA外设源:ADC0:DMA_SUBPERI0
// ADC1:DMA_SUBPERI1
// ADC2:DMA_SUBPERI2
#define DMA_ADC_IRQn DMA1_Channel0_IRQn //DMA1_Channel0_IRQn
//DMA1_Channel1_IRQn
//DMA1_Channel2_IRQn
//DMA1_Channel3_IRQn
//DMA1_Channel4_IRQn
#define DMA_ADC_PRIORITY_PRE 0 //抢占优先级
#define DMA_ADC_PRIORITY_SUB 1 //子优先级
void adc_init(void);
void adc_rcu_config(void);
void adc_gpio_config(void);
void adc_dma_config(void);
void adc_config(void); void adc_config(void);
float ptz_Voltage_collect_adc1_task(); float ptz_Voltage_collect_adc1_task();
float ptz_Current_collect_adc1_task(); float ptz_Current_collect_adc1_task();

View File

@ -44,9 +44,9 @@ void gd32_usart_configure(struct gd32_usart_config *config)
// 配置USART // 配置USART
usart_deinit(config->usart_periph); usart_deinit(config->usart_periph);
usart_baudrate_set(config->usart_periph, config->baud_rate); usart_baudrate_set(config->usart_periph, config->baud_rate);
// usart_word_length_set(config->usart_periph, USART_WL_8BIT); usart_word_length_set(config->usart_periph, USART_WL_8BIT);
// usart_stop_bit_set(config->usart_periph, USART_STB_1BIT); usart_stop_bit_set(config->usart_periph, USART_STB_1BIT);
// usart_parity_config(config->usart_periph, USART_PM_NONE); usart_parity_config(config->usart_periph, USART_PM_NONE);
// usart_hardware_flow_rts_config(config->usart_periph, USART_RTS_DISABLE); // usart_hardware_flow_rts_config(config->usart_periph, USART_RTS_DISABLE);
// usart_hardware_flow_cts_config(config->usart_periph, USART_CTS_DISABLE); // usart_hardware_flow_cts_config(config->usart_periph, USART_CTS_DISABLE);
usart_receive_config(config->usart_periph, USART_RECEIVE_ENABLE); usart_receive_config(config->usart_periph, USART_RECEIVE_ENABLE);