用AI对一段代码进行单元测试

该文章已生成可运行项目,

1 题目

测试代码如下:

#include <stdio.h>

#define MIN_RUN 32

// 插入排序算法
void insertionSort(int arr[], int left, int right) {
    for (int i = left + 1; i <= right; i++) {
        int key = arr[i];
        int j = i - 1;
        while (j >= left && arr[j] > key) {
            arr[j + 1] = arr[j];
            j--;
        }
        arr[j + 1] = key;
    }
}

// 归并函数
void merge(int arr[], int left, int mid, int right) {
    int len1 = mid - left + 1;
    int len2 = right - mid;
    int L[len1], R[len2];

	int i = 0, j = 0, k;
    for (i = 0; i < len1; i++)
        L[i] = arr[left + i];
    for (j = 0; j < len2; j++)
        R[j] = arr[mid + 1 + j];

    i = 0;
	j = 0;
	k = left;

    while (i < len1 && j < len2) {
        if (L[i] <= R[j])
            arr[k++] = L[i++];
        else
            arr[k++] = R[j++];
    }
	
    while (i < len1)
        arr[k++] = L[i++];
    while (j < len2)
        arr[k++] = R[j++];
	while(i>j && len1<len2)
		arr[i++] = arr[j++];
}

// Timsort 算法
void timSort(int arr[], int n) {
    for (int i = 0; i < n; i += MIN_RUN)
        insertionSort(arr, i, (i + MIN_RUN - 1) < n ? (i + MIN_RUN - 1) : (n - 1));

    for (int size = MIN_RUN; size < n; size *= 2) {
        for (int left = 0; left < n; left += 2 * size) {
            int mid = left + size - 1;
            int right = (left + 2 * size - 1) < (n - 1) ? (left + 2 * size - 1) : (n - 1);
            merge(arr, left, mid, right);
        }
    }
}

利用AI工具对以上代码编写单元测试用例

2 说明

ai工具:文心大模型 4.0 Turbo。
测试环境:在Linux环境下,用gcc、gcov和lcov。
测试方式:将以上代码放到sort.c文件中,用ai工具生成测试用例,放到test.c文件中,然后在Linux环境下编译运行,测试是否所有测试用例可以通过,用lcov生成html格式的测试报告。

3 操作过程

3.1 用AI优化需求

首先编写一个让ai生成单元测试代码的需求,然后发给ai让其优化一下。
输入

对这段代码编写单元测试案例,实现100%语句覆盖、判定覆盖、条件覆盖(CC)、条件/判定覆盖(C/DC)、条件组合覆盖(MCC)、修正判定条件覆盖(MCDC)。 
要求: 
1、验证结果是否正确,不用预期结果与输出结果对比的方式,用遍历输出结果,判断是否前一个数据比后一个小 
2、打印出哪些测试用例通过了,哪些测试用例没通过,生成一个结果测试报告。
3、除了生成一些常规的测试数据,再生成一些超长的,里面是随机数的输入数组,数组长度一个是500,一个是1000 
4、生成一些长度不同的输入数组,长度从100连续到299,共200组,里面都是随机数 
5、每个测试用例封装成一个函数。
6、对于第3条和第4条要求的测试用例,打印测试结果时要标明测试数组长度。
7、用malloc申请内存存放输入数据时,测试完要及时释放。
9、常规测试数据里类型多一些,都是一些容易测试出代码问题的数据。
10、测试代码和被测试代码不在同一个文件中,被测试代码已经写好不需要ai再写一遍,只需要生成测试代码

以上是一个我要输入给文心一言的需求,现在对这个需求进行优化,让文心一言输出效果更好

    输出

    为了优化您的需求描述,使其更清晰、具体,并引导生成更高质量的测试代码,以下是对原始需求的优化版本:
    ________________________________________
    测试代码生成需求优化版
    目标:
    为给定的排序函数编写单元测试,确保实现100%的语句覆盖、判定覆盖、条件覆盖(CC)、条件/判定覆盖(C/DC)、条件组合覆盖(MCC)、修正判定条件覆盖(MCDC)。
    具体要求:
    1.	验证方法:
    	不通过预期结果与输出结果对比,而是通过遍历输出结果,判断数组是否已排序(即前一个数据是否比后一个小)。
    2.	测试报告:
    	打印出哪些测试用例通过了,哪些没通过。
    	生成一个详细的测试报告,包括测试用例名称和测试结果。
    3.	测试用例生成:
    	常规测试数据:
    	包含多种类型的数据,如空数组、单元素数组、已排序数组、逆序数组、含重复元素的数组、特殊值数组(如最大/最小值、负数、零等)。
    	这些数据应易于触发代码中的潜在问题。
    	超长随机数组:
    	生成两个长度分别为500和1000的随机数组。
    	打印测试结果时标明测试数组长度。
    	连续长度随机数组:
    	生成长度从100到299的200组随机数组。
    	每组数组长度连续递增,打印测试结果时标明测试数组长度。
    4.	测试用例封装:
    	每个测试用例应封装成一个独立的函数,便于管理和复用。
    5.	内存管理:
    	使用malloc申请内存存放输入数据时,测试完成后要及时释放内存,避免内存泄漏。
    6.	测试代码与被测试代码分离:
    	假设被测试代码已经写好,只需编写测试代码。
    	测试代码应位于与被测试代码不同的文件中。
    优化后的详细步骤:
    1.	编写测试框架:
    	创建一个测试框架,能够执行测试用例并记录结果。
    	提供函数用于打印测试报告。
    2.	实现测试用例:
    	常规测试用例:
    	空数组测试。
    	单元素数组测试。
    	已排序数组测试。
    	逆序数组测试。
    	含重复元素的数组测试。
    	特殊值数组测试(如全为正数、全为负数、混合正负数、含零等)。
    	超长随机数组测试用例:
    	生成并测试长度为500和1000的随机数组。
    	连续长度随机数组测试用例:
    	生成并测试长度从100到299的200组随机数组。
    3.	验证排序结果:
    	在每个测试用例中,遍历排序后的数组,检查是否满足排序条件(前一个元素小于或等于后一个元素)。
    4.	内存管理:
    	确保在每个测试用例中,使用malloc分配的内存都在测试完成后被正确释放。
    5.	生成测试报告:
    	在所有测试用例执行完毕后,生成并打印详细的测试报告,包括每个测试用例的名称、测试结果(通过/失败)以及任何额外的信息(如数组长度)。
    期望输出:
    •	一个清晰的测试报告,显示所有测试用例的执行结果。
    •	对于失败的测试用例,应提供足够的信息以便定位问题。
    ________________________________________
    通过优化后的需求描述,您可以更清晰地指导文心一言生成高质量的测试代码,确保覆盖所有必要的测试场景,并生成详细的测试报告。
    
    

    3.2 用AI生成单元测试代码

    将被测试代码和需求发给AI,让其生成相应的单元测试代码。
    输入

    #include <stdio.h>
    
    #define MIN_RUN 32
    
    // 插入排序算法
    void insertionSort(int arr[], int left, int right) {
        for (int i = left + 1; i <= right; i++) {
            int key = arr[i];
            int j = i - 1;
            while (j >= left && arr[j] > key) {
                arr[j + 1] = arr[j];
                j--;
            }
            arr[j + 1] = key;
        }
    }
    
    // 归并函数
    void merge(int arr[], int left, int mid, int right) {
        int len1 = mid - left + 1;
        int len2 = right - mid;
        int L[len1], R[len2];
    
    	int i = 0, j = 0, k;
        for (i = 0; i < len1; i++)
            L[i] = arr[left + i];
        for (j = 0; j < len2; j++)
            R[j] = arr[mid + 1 + j];
    
        i = 0;
    	j = 0;
    	k = left;
    
        while (i < len1 && j < len2) {
            if (L[i] <= R[j])
                arr[k++] = L[i++];
            else
                arr[k++] = R[j++];
        }
    	
        while (i < len1)
            arr[k++] = L[i++];
        while (j < len2)
            arr[k++] = R[j++];
    	while(i>j && len1<len2)
    		arr[i++] = arr[j++];
    }
    
    // Timsort 算法
    void timSort(int arr[], int n) {
        for (int i = 0; i < n; i += MIN_RUN)
            insertionSort(arr, i, (i + MIN_RUN - 1) < n ? (i + MIN_RUN - 1) : (n - 1));
    
        for (int size = MIN_RUN; size < n; size *= 2) {
            for (int left = 0; left < n; left += 2 * size) {
                int mid = left + size - 1;
                int right = (left + 2 * size - 1) < (n - 1) ? (left + 2 * size - 1) : (n - 1);
                merge(arr, left, mid, right);
            }
        }
    }
    
    测试代码生成需求优化版
    
    目标:
    为给定的排序函数编写单元测试,确保实现100%的语句覆盖、判定覆盖、条件覆盖(CC)、条件/判定覆盖(C/DC)、条件组合覆盖(MCC)、修正判定条件覆盖(MCDC)。
    
    具体要求:
    
    验证方法:
    不通过预期结果与输出结果对比,而是通过遍历输出结果,判断数组是否已排序(即前一个数据是否比后一个小)。
    测试报告:
    打印出哪些测试用例通过了,哪些没通过。
    生成一个详细的测试报告,包括测试用例名称和测试结果。
    测试用例生成:
    常规测试数据:
    包含多种类型的数据,如空数组、单元素数组、已排序数组、逆序数组、含重复元素的数组、特殊值数组(如最大/最小值、负数、零等)。
    这些数据应易于触发代码中的潜在问题。
    超长随机数组:
    生成两个长度分别为500和1000的随机数组。
    打印测试结果时标明测试数组长度。
    连续长度随机数组:
    生成长度从100到299的200组随机数组。
    每组数组长度连续递增,打印测试结果时标明测试数组长度。
    测试用例封装:
    每个测试用例应封装成一个独立的函数,便于管理和复用。
    内存管理:
    使用malloc申请内存存放输入数据时,测试完成后要及时释放内存,避免内存泄漏。
    测试代码与被测试代码分离:
    假设被测试代码已经写好,只需编写测试代码。
    测试代码应位于与被测试代码不同的文件中。
    优化后的详细步骤:
    
    编写测试框架:
    创建一个测试框架,能够执行测试用例并记录结果。
    提供函数用于打印测试报告。
    实现测试用例:
    常规测试用例:
    空数组测试。
    单元素数组测试。
    已排序数组测试。
    逆序数组测试。
    含重复元素的数组测试。
    特殊值数组测试(如全为正数、全为负数、混合正负数、含零等)。
    超长随机数组测试用例:
    生成并测试长度为500和1000的随机数组。
    连续长度随机数组测试用例:
    生成并测试长度从100到299的200组随机数组。
    验证排序结果:
    在每个测试用例中,遍历排序后的数组,检查是否满足排序条件(前一个元素小于或等于后一个元素)。
    内存管理:
    确保在每个测试用例中,使用malloc分配的内存都在测试完成后被正确释放。
    生成测试报告:
    在所有测试用例执行完毕后,生成并打印详细的测试报告,包括每个测试用例的名称、测试结果(通过/失败)以及任何额外的信息(如数组长度)。
    期望输出:
    
    一个清晰的测试报告,显示所有测试用例的执行结果。
    对于失败的测试用例,应提供足够的信息以便定位问题。
    
    

    输出

    为了实现你要求的测试框架和测试用例,我们将创建一个新的C文件来包含测试代码,并确保与被测试代码(即timSort函数)分离。以下是详细的实现步骤:
    1. 测试框架
    首先,我们创建一个测试框架,能够执行测试用例并记录结果。
    c复制代码
    	#include <stdio.h>
    	#include <stdlib.h>
    	#include <stdbool.h>
    	#include <time.h>
    	
    	// 假设 timSort 函数声明在这里(通常通过包含头文件)
    	extern void timSort(int arr[], int n);
    	
    	// 检查数组是否已排序
    	bool isSorted(int arr[], int n) {
    	for (int i = 0; i < n - 1; i++) {
    	if (arr[i] > arr[i + 1]) {
    	return false;
    	}
    	}
    	return true;
    	}
    	
    	// 打印测试报告
    	void printTestReport(const char* testName, bool result, int length = -1) {
    	if (length == -1) {
    	printf("Test Case: %s - %s\n", testName, result ? "Passed" : "Failed");
    	} else {
    	printf("Test Case: %s (Length: %d) - %s\n", testName, length, result ? "Passed" : "Failed");
    	}
    	}
    	
    	// 测试用例模板
    	void runTestCase(const char* testName, int* arr, int n) {
    	timSort(arr, n);
    	bool result = isSorted(arr, n);
    	printTestReport(testName, result, n);
    	// 释放内存(如果适用)
    	// 注意:在这个框架中,假设传入数组不是动态分配的,因此不需要释放
    	}
    2. 实现测试用例
    接下来,我们实现具体的测试用例。
    c复制代码
    	void testEmptyArray() {
    	int arr[0];
    	runTestCase("Empty Array", arr, 0);
    	}
    	
    	void testSingleElementArray() {
    	int arr[1] = {1};
    	runTestCase("Single Element Array", arr, 1);
    	}
    	
    	void testSortedArray() {
    	int arr[] = {1, 2, 3, 4, 5};
    	runTestCase("Sorted Array", arr, 5);
    	}
    	
    	void testReverseSortedArray() {
    	int arr[] = {5, 4, 3, 2, 1};
    	runTestCase("Reverse Sorted Array", arr, 5);
    	}
    	
    	void testArrayWithDuplicates() {
    	int arr[] = {3, 3, 3, 2, 2, 1, 1};
    	runTestCase("Array With Duplicates", arr, 7);
    	}
    	
    	void testSpecialValuesArray() {
    	int arr[] = {INT_MAX, INT_MIN, 0, -1, 1, 99999, -99999};
    	runTestCase("Special Values Array", arr, 7);
    	}
    	
    	void testLongRandomArray(int length) {
    	int* arr = (int*)malloc(length * sizeof(int));
    	if (arr == NULL) {
    	printf("Memory allocation failed for length %d\n", length);
    	return;
    	}
    	
    	// 填充随机数
    	srand(time(NULL));
    	for (int i = 0; i < length; i++) {
    	arr[i] = rand() % 100000 - 50000; // 随机数范围 [-50000, 49999]
    	}
    	
    	runTestCase("Long Random Array", arr, length);
    	
    	// 释放内存
    	free(arr);
    	}
    	
    	void testSequentialLengthRandomArrays() {
    	for (int length = 100; length < 300; length++) {
    	testLongRandomArray(length);
    	}
    	}
    	
    	int main() {
    	// 运行常规测试用例
    	testEmptyArray();
    	testSingleElementArray();
    	testSortedArray();
    	testReverseSortedArray();
    	testArrayWithDuplicates();
    	testSpecialValuesArray();
    	
    	// 运行超长随机数组测试用例
    	testLongRandomArray(500);
    	testLongRandomArray(1000);
    	
    	// 运行连续长度随机数组测试用例
    	testSequentialLengthRandomArrays();
    	
    	return 0;
    	}
    3. 解释与注意事项
    •	测试框架:runTestCase函数用于执行排序并检查结果,同时打印测试报告。
    •	测试用例:每个测试用例都是一个独立的函数,便于管理和复用。
    •	内存管理:在testLongRandomArray中,使用malloc分配内存,并在测试完成后使用free释放内存。
    •	随机数组生成:使用rand函数生成随机数,并用srand(time(NULL))确保每次运行产生不同的随机数序列。
    •	测试报告:printTestReport函数用于打印每个测试用例的结果,包括名称、是否通过以及数组长度(如果适用)。
    这个测试框架和测试用例覆盖了多种可能的输入情况,确保了较高的代码覆盖率,并能够帮助定位潜在的问题。
    
    

    3.3 搭建测试环境 

    将ai生成的代码放到test.c中,并做一些优化。内容如下:

    #define MIN_RUN 32
    
    #define INT_MAX 2147483647
    #define INT_MIN -2147483648
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <stdbool.h>
    #include <time.h>
     
    // 假设 timSort 函数声明在这里(通常通过包含头文件)
    extern void timSort(int arr[], int n);
     
    // 检查数组是否已排序
    bool isSorted(int arr[], int n) {
        for (int i = 0; i < n - 1; i++) {
            if (arr[i] > arr[i + 1]) {
                return false;
            }
        }
        return true;
    }
     
    // 打印测试报告
    void printTestReport(const char* testName, bool result, int length) {
        if (length == -1) {
            printf("Test Case: %s - %s\n", testName, result ? "Passed" : "Failed");
        } else {
            printf("Test Case: %s (Length: %d) - %s\n", testName, length, result ? "Passed" : "Failed");
        }
    }
     
    // 测试用例模板
    void runTestCase(const char* testName, int* arr, int n) {
        timSort(arr, n);
        bool result = isSorted(arr, n);
        printTestReport(testName, result, n);
        // 释放内存(如果适用)
        // 注意:在这个框架中,假设传入数组不是动态分配的,因此不需要释放
    }
    
    void testEmptyArray() {
        int arr[0];
        runTestCase("Empty Array", arr, 0);
    }
     
    void testSingleElementArray() {
        int arr[1] = {1};
        runTestCase("Single Element Array", arr, 1);
    }
     
    void testSortedArray() {
        int arr[] = {1, 2, 3, 4, 5};
        runTestCase("Sorted Array", arr, 5);
    }
     
    void testReverseSortedArray() {
        int arr[] = {5, 4, 3, 2, 1};
        runTestCase("Reverse Sorted Array", arr, 5);
    }
     
    void testArrayWithDuplicates() {
        int arr[] = {3, 3, 3, 2, 2, 1, 1};
        runTestCase("Array With Duplicates", arr, 7);
    }
     
    void testSpecialValuesArray() {
        int arr[] = {INT_MAX, INT_MIN, 0, -1, 1, 99999, -99999};
        runTestCase("Special Values Array", arr, 7);
    }
     
    void testLongRandomArray(int length) {
        int* arr = (int*)malloc(length * sizeof(int));
        if (arr == NULL) {
            printf("Memory allocation failed for length %d\n", length);
            return;
        }
        
        // 填充随机数
        srand(time(NULL));
        for (int i = 0; i < length; i++) {
            arr[i] = rand() % 100000 - 50000; // 随机数范围 [-50000, 49999]
        }
        
        runTestCase("Long Random Array", arr, length);
        
        // 释放内存
        free(arr);
    }
     
    void testSequentialLengthRandomArrays() {
        for (int length = 100; length < 300; length++) {
            testLongRandomArray(length);
        }
    }
     
    int main() {
        // 运行常规测试用例
        testEmptyArray();
        testSingleElementArray();
        testSortedArray();
        testReverseSortedArray();
        testArrayWithDuplicates();
        testSpecialValuesArray();
        
        // 运行超长随机数组测试用例
        testLongRandomArray(500);
        testLongRandomArray(1000);
        
        // 运行连续长度随机数组测试用例
        testSequentialLengthRandomArrays();
        
        return 0;
    }
    

    将被测试代码放到sort.c中,编写一个脚本用于编译生成可执行文件,然后运行并生成测试覆盖率报告。测试目录内容如下:
    在这里插入图片描述
    其中test.sh的内容如下:
    在这里插入图片描述
    sort.c是被测试代码。

    3.4 第1次测试

    运行test.sh脚本,生成的测试报告如下:
    在这里插入图片描述
    从测试报告可以看出,在处理长度为129的数组时,程序运行发生的错误,在sort.c文件中加一些打印信息用于调试,添加过程如下:
    在这里插入图片描述
    然后只测试长度129的数组,运行结果如下:
    在这里插入图片描述
    可以看到出错原因是因为运行到这里时,mid比right的值大,而merge 函数内容如下:
    在这里插入图片描述
    当mid大于right时,len2的计算结果为负数,这使得声明数组R时出现错误。所以当mid大于right时,表示不能分成两段进行合并 ,因此就不需要合并。根据以上分析优化代码如下:
    在这里插入图片描述
    再一次测试,测试用例全部通过。

    3.5 第2次测试

    在分析第一个问题时发现,merge函数中声明L数组和R数组的方式有些问题,代码如下:
    在这里插入图片描述
    这种方式声明的L数组和R数组存放在栈空间,栈空间相对较小,当输入的排序数组过大时,可能会出现内存溢出。为了验证是否会出现内存溢出,增加一个100M的输入数组用来测试。修改test.c内容如下:
    在这里插入图片描述
    用修改完的test.c文件进一步测试,发现果然在处理100M大数组时出现程序运行错误,如下:
    在这里插入图片描述
    根据以上分析,决定将L和R用malloc的方式申请内存,使其数据存放到内存较大的堆空间,修改代码如下:
    在这里插入图片描述
    然后再一次测试发现测试用例全部通过,测试结果如下:

    在这里插入图片描述
    在这里插入图片描述
    这时查看代码运行覆盖率报告,结果如下:

    在这里插入图片描述
    可以看到其中有一段代码没有被运行到。

    3.5 第3次测试

    以上所写操作方式并不是第一次就是这么做的,经历过多次的迭代,初期让ai生成测试代码时,并没有附加多条要求,这时ai生成的测试代码总是有几条无法覆盖。将覆盖率报告反馈给ai让其优化测试代码时,ai指出来一段错误代码,如下:
    在这里插入图片描述
    原始代码如下:

    在这里插入图片描述
    前经过前面的代码处理后,这时应该i=len1、j=len2,所以不会出现(i>j && len1<len2)的情况。而且前面步骤已经将数据处理完毕,所以45行、46行是错误的代码行。
    将错误代码删除,修改如下:

    在这里插入图片描述
    用修改之后的代码再测试,此时测试用例全部通过,并且代码运行覆盖率为100%,结果如下:
    在这里插入图片描述
    在这里插入图片描述

    最后: 下方这份完整的软件测试     视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】

    ​​​件测试面试文档

    我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

    在这里插入图片描述

    在这里插入图片描述

    本文章已经生成可运行项目
    下载代码方式:https://pan.quark.cn/s/dd3561eca308 在软件开发领域,面向对象编程(OOP)是一种普遍采纳的结构化方法,它使得开发者能够借助模拟现实环境中的实体和关系来构建软件系统。在本案例中,我们观察到的是一个关于借助抽象类来执行不同几何图形面积求解的实践应用。现在,让我们详细分析这一议题。 标题 "应用抽象类计算面积" 清晰地表明我们将要讨论一个抽象类,此类设定了一个用于测量图形面积的标准函数,但并未提供实际的执行过程。抽象类在诸如C#或Java等编程语言中通常借助`abstract`修饰符进行声明,它们无法直接创建对象实例,仅能作为其他类的基础模板。 描述部分提及的"图形界面应用"暗示这是一个基于视觉用户界面(GUI)的系统,可能运用了.NET Framework的Windows Forms或WPF技术,或者是Java平台的Swing或JavaFX框架。在这样环境下,用户能够通过视觉元素与这些几何体进行互动,例如输入相关尺寸并观看到计算得出的面积值。 抽象类“几何体”内嵌了“计算面积”这一抽象函数。在代码层面,这可以被表述为: ```csharp public abstract class GeometricShape { public abstract double CalculateArea(); } ``` 随后,有三个派生类:圆(Circle)、矩形(Rectangle)和三角形(Triangle),它们各自提供了这个抽象函数的具体实现。比如,圆的面积是通过π乘以半径的平方得到的,矩形的面积是长和宽的乘积,而三角形的面积可能是底乘以高再除以2的结果。这些类将提供具体实现来计算它们各自的面积: ```csharp p...
    内容概要:本文系统研究了移相控制全桥LLC谐振变换器的工作特性,深入分析其在不同工作模式下的运行机理与性能表现,重点探讨了软开关实现、高效率能量转换及宽范围电压调节等关键技术优势。通过Simulink搭建精确的仿真模型,对谐振腔参数、开关频率、电压增益、系统效率等关键指标进行仿真分析,验证了理论设计的正确性。同时,详细研究了移相控制策略对系统动态响应、稳定性和轻载/重载工况适应性的影响,揭示了控制参数与电路参数之间的耦合关系,为高频高效电源设计提供了理论依据和实践指导。; 适合人群:具备电力电子技术、模拟电路及自动控制理论基础,从事开关电源、新能源变换器、电动汽车充电模块或高频电源系统研发的工程师及高校研究生。; 使用场景及目标:①掌握全桥LLC谐振变换器的拓扑结构、工作原理与关键参数设计方法;②理解移相控制在实现零电压开通(ZVS)和零电流关断(ZCS)中的作用机制;③通过Simulink仿真掌握变换器建模、参数优化与性能评估流程,服务于实际产品开发与学术课题研究。; 阅读建议:建议读者结合提供的Simulink仿真模型进行同步操作,重点关注谐振网络(Lr, Lm, Cr)参数与移相角之间的匹配设计,深入理解软开关条件的形成过程,并通过调整负载和输入电压进行多工况仿真,以全面掌握系统动态特性。
    一、项目概述 本项目设计并实现了一个基于STM32F103C8T6微控制器的温湿度监测与报警系统。系统通过DHT11传感器实时采集环境温湿度数据,当数据超过预设阈值时,蜂鸣器发出声音报警,同时通过4位数码管实时显示当前温湿度值。整个系统采用Type-C接口供电,支持USB串口通信,便于数据调试与传输。 二、硬件组成 1. 主控模块:STM32F103C8T6最小系统(含晶振、复位、BOOT电路、去耦电容)。 2. 传感器模块:DHT11温湿度传感器(单总线通信)。 3. 报警模块:有源蜂鸣器(三极管驱动)。 4. 显示模块:4位共阴数码管(TM1637驱动)。 5. 通信模块:CH340N USB转串口芯片(Type-C接口)。 6. 电源模块:AMS1117-3.3稳压电路(5V转3.3V)。 7. 调试接口:SWD调试排针(SWDIO/SWCLK)。 三、开发流程 1. 原理图设计:使用嘉立创EDA绘制完整原理图,包含各功能模块。 2. PCB设计:进行PCB布局布线,注重电源完整性、信号隔离及晶振走线。 3. 制板焊接:嘉立创打样,手工焊接元器件。 4. 软件开发:STM32CubeMX配置工程,编写DHT11驱动、TM1637显示、串口通信及报警逻辑。 5. 调试测试:通过SWD下载程序,串口输出数据,测试温湿度采集与报警功能。 四、项目特点 - 完整的嵌入式系统开发流程(硬件设计→制板→软件编程→调试)。 - 多传感器数据融合与实时显示。 - 低功耗设计,支持USB供电与串口通信。 - 模块化设计,便于功能扩展(如添加WiFi模块、数据存储等)。 五、应用前景 适用于家庭环境监测、农业大棚、仓库温湿度监控等场景
    内容概要:本文提出了一种基于TOGI-SOGI混合积分器的光储并网谐波自适应抑制方法,并通过Simulink实现完整仿真验证。该方法融合三重二阶广义积分器(TOGI)与标准二阶广义积分器(SOGI),能够精确提取电网电压中的基波正序分量,有效分离并抑制高次谐波成分,尤其在电网电压畸变条件下显著提升了并网逆变器的控制精度与电能质量。文中详细阐述了混合积分器的结构设计、谐波检测机制、自适应调节策略及其在锁相环(PLL)中的集成应用,并通过构建光储并网系统模型进行多工况仿真,结果表明该方法具备优良的动态响应特性、强鲁棒性及谐波抑制能力。; 适合人群:具备电力电子、新能源发电、自动控制等相关专业背景,熟悉Simulink仿真环境,从事光伏并网控制、电能质量治理、微电网运行与控制等领域研究的科研人员、工程技术人员及研究生。; 使用场景及目标:①应用于电网存在谐波污染的光伏发电并网场景,提升逆变器在非理想电网下的运行稳定性;②为基于广义积分器的先进锁相技术与谐波补偿策略提供理论支持与实现范例;③服务于高校科研项目复现、学位论文研究、电力电子控制器原型开发及学术成果验证。; 阅读建议:建议学习者结合提供的Simulink模型深入剖析TOGI-SOGI的内部信号流向与参数整定逻辑,重点关注谐波分量的解耦过程与自适应控制模块的实现机制,可通过设置不同谐波含量、频率偏移等扰动工况进行对比测试,以全面掌握其在复杂电网环境下的适应性与优越性。
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值