标题: ucosii+STM32 BLDC电机控制器设计 附源程序Proteus仿真 [打印本页]
作者: xuhe123 时间: 2020-1-21 09:38
标题: ucosii+STM32 BLDC电机控制器设计 附源程序Proteus仿真
嵌入式,现在把我的程序和设计思路分享给大家。
软件所用版本如下
Proteus版本 SP 8.7
STM32CubeMX 版本 5.4.0
HAL固件库版本 1.8.0
Keil 版本 uVison5
一、设计思路:
使用STM32CubeMX软件进行资源初始化(Cube资源配置很方便),使用HAL库进行程序设计。
图1 资源配置图
二、系统功能介绍:
三、软件设计说明:
- 可调转速通过可调电阻和STM32的ADC功能,实现500-4596范围的速度调节。使用的是简单的比例控制,并未使用复杂的PID控制(太难了,一直调不好)。
- 通过定时器1的PWM互补输出六路PWM控制电机的转动,驱动器使用L293D和IRF540 MOS管。
- 换向使用的是外部中断,测速使用的是定时器2的三鹿输入捕获,这里有一个坑,proteus中三路输入捕获无法同时工作,本来打算三路都做测速逻辑,但是速度变化很大,所以最后只使用了一路作为测速通道。
- 正反转使用的是外部中断。
- 显示转速和目标转速使用的是lcd1602,在proteus仿真中,显示转速有一定的延时和误差(其实是proteus的仿真太慢了,多开一个任务就慢的要死)
6、使用ucosii进入分功能多任务处理。
四、调试及运行结果
图2 电机刚启动,速度未达到最小速度500
速度未达到最小速度时加载很快,大概加载到300rpm左右开始pid控制。
图3 仿真过程中
图4 仿真过程中
图5 反转时的调速过程
仿真过程中可以看到定时器PWM输出之间的切换以及脉宽的变化。
图6 接近稳定时
图7 反转时接近稳定
图8 稳定后增大转速
由于proteus中stm32 的定时器计时很坑,延时根本不对,需要修改芯片的时钟源频率,改大了仿真慢,改小了又不准,所以ADC采样值和转速之间只能近似转换,也造成了目标转速和实际转速的误差。
图9 整体电路图
五、心得体会
在这次设计过程中,期间遇到许许多多问题,对电机的控制不熟悉导致换向失败,仿真过程不收敛,定时器不起作用,引脚之间相互干扰,输入捕获无法同时进行,pwm模式设置错误导致pid控制越调速度越快等等问题,最后都比较好的解决了这些问题,当然程序和设计中还存在一些问题,由于时间关系无法全部解决,在以后的学习过程中,如果有机会会继续深入学习。
单片机源程序如下:
- /* USER CODE END Header */
- /* Includes ------------------------------------------------------------------*/
- #include "main.h"
- #include "adc.h"
- #include "tim.h"
- #include "gpio.h"
- /* Private includes ----------------------------------------------------------*/
- /* USER CODE BEGIN Includes */
- #include "includes.h"
- #include "lcd.h"
- /* USER CODE END Includes */
- /* Private typedef -----------------------------------------------------------*/
- /* USER CODE BEGIN PTD */
- /* USER CODE END PTD */
- /* Private define ------------------------------------------------------------*/
- /* USER CODE BEGIN PD */
- #define HALL_GPIO GPIOA
- //START 任务
- //设置任务优先级
- #define START_TASK_PRIO 10 //开始任务的优先级设置为最低
- //设置任务堆栈大小
- #define START_STK_SIZE 64
- //任务堆栈
- OS_STK START_TASK_STK[START_STK_SIZE];
- //任务函数
- void start_task(void *pdata);
-
- //LED0任务
- //设置任务优先级
- #define LED0_TASK_PRIO 2
- //设置任务堆栈大小
- #define LED0_STK_SIZE 64
- //任务堆栈
- OS_STK LED0_TASK_STK[LED0_STK_SIZE];
- //任务函数
- void led0_task(void *pdata);
- //Speed_ADC 任务
- //设置任务优先级
- #define SPEED_ADC_TASK_PRIO 1
- //设置任务堆栈大小
- #define SPEED_ADC_STK_SIZE 64
- //任务堆栈
- OS_STK SPEED_ADC_TASK_STK[SPEED_ADC_STK_SIZE];
- //任务函数
- void speed_adc_task(void *pdata);
- /* USER CODE END PD */
- /* Private macro -------------------------------------------------------------*/
- /* USER CODE BEGIN PM */
- /* USER CODE END PM */
- /* Private variables ---------------------------------------------------------*/
- /* USER CODE BEGIN PV */
- //定时器2捕获通道参数
- /* Private variables ---------------------------------------------------------*/
- uint16_t Channel1HighTime, Channel2HighTime, Channel3HighTime; //高电平时间
- uint16_t Channel1Period, Channel2Period, Channel3Period; //周期
- uint8_t Channel1Edge = 0, Channel2Edge = 0, Channel3Edge = 0; //上升沿
- uint16_t Channel1Percent, Channel2Percent, Channel3Percent; //占空比
- uint16_t Channel1PercentTemp[3] = {0, 0, 0};
- uint8_t Channel1TempCount = 0;
- uint16_t Channel1RisingTimeLast=0, Channel1RisingTimeNow, Channel1FallingTime;
- uint16_t Channel2RisingTimeLast=0, Channel2RisingTimeNow, Channel2FallingTime;
- uint16_t Channel3RisingTimeLast=0, Channel3RisingTimeNow, Channel3FallingTime;
- extern int motor_period;
- extern int motor_duty;
- extern int clock_wise;
- int current_speed = 0;
- int ADC_Speed = 500; //555 / 90% = 500
- int ADC_Value = 555; //
- BOOLEAN state = 0; // 0 关闭中 1 启动中
- /* USER CODE END PV */
- /* Private function prototypes -----------------------------------------------*/
- void SystemClock_Config(void);
- /* USER CODE BEGIN PFP */
- /* USER CODE END PFP */
- /* Private user code ---------------------------------------------------------*/
- /* USER CODE BEGIN 0 */
- /* USER CODE END 0 */
- /**
- * @brief The application entry point.
- * @retval int
- */
- int main(void)
- {
- /* USER CODE BEGIN 1 */
- HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
- OSInit();
- OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );//创建起始任务
- /* USER CODE END 1 */
-
- /* MCU Configuration--------------------------------------------------------*/
- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
- HAL_Init();
- /* USER CODE BEGIN Init */
- /* USER CODE END Init */
- /* Configure the system clock */
- SystemClock_Config();
- /* USER CODE BEGIN SysInit */
-
- /* USER CODE END SysInit */
- /* Initialize all configured peripherals */
- MX_GPIO_Init();
- MX_TIM1_Init();
- MX_ADC1_Init();
- MX_TIM2_Init();
- /* USER CODE BEGIN 2 */
- OSStart();
- /* USER CODE END 2 */
- /* Infinite loop */
- /* USER CODE BEGIN WHILE */
- while (1)
- {
- /* USER CODE END WHILE */
- /* USER CODE BEGIN 3 */
- }
- /* USER CODE END 3 */
- }
- /**
- * @brief System Clock Configuration
- * @retval None
- */
- void SystemClock_Config(void)
- {
- RCC_OscInitTypeDef RCC_OscInitStruct = {0};
- RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
- RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
- /** Initializes the CPU, AHB and APB busses clocks
- */
- RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
- RCC_OscInitStruct.HSEState = RCC_HSE_ON;
- RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
- RCC_OscInitStruct.HSIState = RCC_HSI_ON;
- RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
- RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
- RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL2;
- if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
- {
- Error_Handler();
- }
- /** Initializes the CPU, AHB and APB busses clocks
- */
- RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
- |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
- RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
- RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV2;
- RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
- RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
- if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
- {
- Error_Handler();
- }
- PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;
- PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV2;
- if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
- {
- Error_Handler();
- }
- }
- /* USER CODE BEGIN 4 */
- //开始任务
- void start_task(void *pdata)
- {
- // //设置通道1的脉宽。 width = (1000 - 500) / 1000 = 50%
- __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, motor_duty);
- __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, motor_duty);
- __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_3, motor_duty);
-
- //打开定时器2通道 , 中断使能
- HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);
- HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2);
- HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_3);
- HAL_Delay(100);
- //开启定时器1的通道1
- HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1);
- HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_2);
- HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_3);
- //
- HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
- HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);
- HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_3);
-
- //
- uint16_t hall_read = (HALL_GPIO->IDR)&0x0007; // 获取霍尔传感器状态 pin0 1 2__IO uint8_t uwStep = 0;
- BLDC_PHASE_CHANGE(hall_read); // 驱动换相
-
- //PID初始化
- Speed_PIDInit();
-
- OS_CPU_SR cpu_sr=0;
- OS_ENTER_CRITICAL(); //进入临界区(无法被中断打断)
- OSTaskCreate(led0_task,(void *)0,(OS_STK*)&LED0_TASK_STK[LED0_STK_SIZE-1],LED0_TASK_PRIO);
- OSTaskCreate(speed_adc_task,(void *)0,(OS_STK*)&SPEED_ADC_TASK_STK[SPEED_ADC_STK_SIZE-1],SPEED_ADC_TASK_PRIO);
- OSTaskSuspend(START_TASK_PRIO); //挂起起始任务.
- OS_EXIT_CRITICAL(); //退出临界区(可以被中断打断)
- }
- //LED0任务
- void speed_adc_task(void *pdata)
- {
- lcd_system_reset();
- unsigned char temp_table[16] ={"Cur_Speed:"};
- unsigned char temp_table1[16] ={"Tar_Speed:"};
- for(uint8_t i=0;i<10;i++)
- {
- lcd_char_write(i,0,temp_table[i]);
- lcd_char_write(i,1,temp_table1[i]);
- }
- HAL_ADC_Start(&hadc1);
- while(1)
- {
- HAL_ADC_PollForConversion(&hadc1,0); //等待转换完成,第二个参数代表最长等待时间ms
- if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC))
- {
- ADC_Value = HAL_ADC_GetValue(&hadc1); // 读取ADC数据 ,4096 -> 3.3V
- ADC_Speed = ADC_Value + 500; //转换公式 0-4096 -> 500 - 4596
- // if(ADC_Speed > 100){
- // HAL_GPIO_TogglePin(led_GPIO_Port, led_Pin);
- // }
- }
- //当前速度
- temp_table[10]=current_speed/1000+'0';
- temp_table[11]=current_speed/100%10+'0';
- temp_table[12]=current_speed/10%10+'0';
- temp_table[13]=current_speed%10+'0';
- //目标速度
- temp_table1[10]=ADC_Speed/1000+'0';
- temp_table1[11]=ADC_Speed/100%10+'0';
- temp_table1[12]=ADC_Speed/10%10+'0';
- temp_table1[13]=ADC_Speed%10+'0';
- for(uint8_t i=10;i<14;i++)
- {
- lcd_char_write(i,0,temp_table[i]);
- lcd_char_write(i,1,temp_table1[i]);
- }
- }
- }
- //speed adc 采样函数
- void led0_task(void *pdata)
- {
- while(1)
- {
- HAL_GPIO_WritePin(led_GPIO_Port, led_Pin, GPIO_PIN_SET);
- OSTimeDly(10);
- HAL_GPIO_WritePin(led_GPIO_Port, led_Pin, GPIO_PIN_RESET);
- OSTimeDly(10);
- }
- }
- //外部中断服务函数
- void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
- {
- if(!state)
- {
- __IO uint8_t uwStep = 0;
- uint16_t hall_read=(HALL_GPIO->IDR)&0x0007; // 获取霍尔传感器状态 pin0 1 2
- uwStep = hall_read;
- BLDC_PHASE_CHANGE(uwStep); // 驱动换相
-
- }
- uint16_t key_read =(Start_GPIO_Port->IDR)&0x00e0;
- if(key_read == 0x00c0)
- {
- // state = !state;
- // HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_1);
- // HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_2);
- // HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_3);
- //
- // //BLDC_PHASE_CHANGE(7);
- // HAL_TIM_Base_MspDeInit(&htim1);
- //
- // HAL_Delay(300);
- // HAL_TIM_Base_MspDeInit(&htim1);
- // HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
- // HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);
- // HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_3);
- // BLDC_PHASE_CHANGE(7);
- //HAL_GPIO_TogglePin(led_GPIO_Port, led_Pin);
- }else if(key_read == 0x00a0)
- {
- clock_wise = 0;
- }else if(key_read == 0x0060)
- {
- clock_wise = 1;
- }
- }
- //定时器2中断函数
- //溢出时间为1s
- //溢出值1000 每个点为1ms
- void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
- {
-
- if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) //捕获中断
- {
- /*
- 测速逻辑
- 1、中断产生,先判断是否为第一次上升沿
- 2、捕获到上升沿后,将时间点存入变量,切换捕获下降沿
- 3、捕获到下降沿后,记下时间点,切换为捕获上升沿
- 4、捕获到上升沿后,记下时间点
- 5、计算周期和占空比
- 6、问题如果经过多个周期才有一次上升沿和下降沿怎么办,需要记录溢出次数
- 如果溢出的时候有上升沿标志位
-
- 问题:proteus三路输入捕获计算,测转速时,如果第一个上升沿和第二个上升沿不在一个定时器计数周期,会计算失败
- */
- if(Channel1Edge == 0)
- {
- //获取通道1上升沿时间点
- Channel1RisingTimeNow = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_1);
- Channel1Edge = 1;//捕获上升沿置位
- Channel1RisingTimeLast = Channel1RisingTimeNow;
- }else if(Channel1Edge == 1)
- {
- Channel1RisingTimeNow = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_1);
- if(Channel1RisingTimeNow > Channel1RisingTimeLast)
- {
- Channel1Period = Channel1RisingTimeNow - Channel1RisingTimeLast;
- }
- else
- {
- //Channel2Period = Channel2RisingTimeNow + 1000 - Channel2RisingTimeLast + 1;
- }
- Channel1Edge = 0;
- //pid计算
- // current_speed = 60*1000 / Channel1Period; //转速计算
- // current_speed = current_speed * 5; //速度调整系数
- // motor_duty = Speed_PIDAdjust(current_speed);
- }
- }else if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
- {
- if(Channel2Edge == 0)
- {
- Channel2RisingTimeNow = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_2);
- Channel2Edge = 1;
-
- Channel2RisingTimeLast = Channel2RisingTimeNow;
- }
- else if(Channel2Edge == 1)
- {
- Channel2RisingTimeNow = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_2);
- if(Channel2RisingTimeNow > Channel2RisingTimeLast)
- {
- Channel2Period = Channel2RisingTimeNow - Channel2RisingTimeLast;
- }
- else
- {
- //Channel2Period = Channel2RisingTimeNow + 1000 - Channel2RisingTimeLast + 1;
- }
- current_speed = 60*1000 / Channel2Period;
- current_speed = current_speed * 5; //速度调整系数
- motor_duty = Speed_PIDAdjust(current_speed);
- Channel2Edge = 0;
- }
- }
- else if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_3)
- {
- if(Channel3Edge == 0)
- {
- Channel3RisingTimeNow = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_3);
- Channel3Edge = 1;
- Channel3RisingTimeLast = Channel3RisingTimeNow;
- }
- else if(Channel3Edge == 1)
- {
- Channel3RisingTimeNow = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_3);
- if(Channel3RisingTimeNow > Channel3RisingTimeLast)
- {
- Channel3Period = Channel3RisingTimeNow - Channel3RisingTimeLast;
- }
- else
- {
- //Channel3Period = Channel3RisingTimeNow + 1000 - Channel3RisingTimeLast + 1;
- }
- // current_speed = 60*1000 / Channel3Period;
- // current_speed = current_speed * 5; //速度调整系数
- // motor_duty = Speed_PIDAdjust(current_speed);
- Channel3Edge = 0;
- }
- }
- }
- /* USER CODE END 4 */
- /**
- * @brief This function is executed in case of error occurrence.
- * @retval None
- */
- void Error_Handler(void)
- {
- /* USER CODE BEGIN Error_Handler_Debug */
- /* User can add his own implementation to report the HAL error return state */
- /* USER CODE END Error_Handler_Debug */
- }
- #ifdef USE_FULL_ASSERT
- /**
- * @brief Reports the name of the source file and the source line number
- * where the assert_param error has occurred.
- * @param file: pointer to the source file name
- * @param line: assert_param error line source number
- * @retval None
- */
- void assert_failed(uint8_t *file, uint32_t line)
- {
- /* USER CODE BEGIN 6 */
- /* User can add his own implementation to report the file name and line number,
- tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
- /* USER CODE END 6 */
- }
- #endif /* USE_FULL_ASSERT */
- /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
复制代码
所有资料51hei提供下载:
Proteus.zip
(102.55 KB, 下载次数: 554)
文档.docx
(758.47 KB, 下载次数: 378)
uCos_ii_Demo.7z
(5.21 MB, 下载次数: 497)
作者: 18805483802 时间: 2020-3-1 16:39
这个是真的厉害
作者: zcllom 时间: 2020-3-11 16:48
原来楼主另外开了一个帖,挺厉害的,这个仿真做到漂亮。
作者: gx2430 时间: 2020-3-12 08:48
下来学习下,谢谢!
作者: mainloop 时间: 2020-3-13 09:17
挺厉害的 ,学习了,与大神共同学习。
作者: zcllom 时间: 2020-3-14 11:18
看了楼主的仿真,有些地方我认为有点问题,三相驱动桥的接法有问题,上下桥不能共用一个GND的。
还有程序上,一般单桥臂载波就行了。上桥臂输出PWM,下桥臂恒通,换相时再一起关断。比如某个时段,Q1、Q4作为对管驱动电机的U相、V相(U+、V-)。那么这段时间,Q4可以一直导通的,Q1发PWM就行了。
作者: bouna 时间: 2020-3-14 20:29
thank yu very much
作者: 伞状飞行器 时间: 2020-3-14 22:31
刚入电子坑的小白前来学习,给楼主点赞
作者: xuhe123 时间: 2020-5-3 23:15
仿真里面是可以的
作者: 永不开的城南花 时间: 2020-6-21 16:50
楼主,我有问题想问一下,代码里面的include里面main.h我为什么报错啊?是不是写错着呢?
这四个头文件都是怎么来的?楼主能发一下吗?
作者: xuhe123 时间: 2020-8-9 10:20
这个是cube生成的时候我勾选生成了头文件,程序里应该有,没找到报错可能是你的keil没有设置头文件路径
作者: fortin 时间: 2020-8-11 20:47
这是PID控制吗
作者: xuhe123 时间: 2020-8-24 20:12
只用了比例控制
作者: dddggg412 时间: 2021-2-21 16:20
仿真并不是非常真
作者: /hang 时间: 2021-4-18 18:17
您好,xuhe:
keil工程可以下载吗,按照你贴出来的代码不能运行,不知道是不是我工程配置有问题呢,谢谢
作者: Longwan 时间: 2021-6-26 23:00
优秀!
作者: hank007 时间: 2021-7-2 16:56
楼主,太好了,又玩操作系统,还带电机的,感谢分享
作者: buck 时间: 2021-7-22 09:40
多谢老大,一直莫不着头脑
作者: yilinghai 时间: 2021-10-11 16:53
请教一下,源程序是在哪个文件夹里
作者: 我的2 时间: 2023-4-20 10:37
为什么还是闪退
作者: 涟浅 时间: 2023-6-4 16:25
楼主还是6的
作者: Kara-kala-10 时间: 2023-7-6 17:49
hello sir im student in Master 2 mecatronics and i work on this project can you provide me this simulations files please
作者: Kara-kala-10 时间: 2023-7-6 17:51
Hello sir im student in master 2 and i work on the same project please i can't download the files because i m not from c im Moroccan can you help me ..? thanks
作者: Kara-kala-10 时间: 2023-7-13 22:01
Hello dear friends if some one might help me i download the files but the simulation didn't work with me where is the error please if you can help me I'm studen.
-
erreur simulation.png
(112.01 KB, 下载次数: 99)
作者: mick32 时间: 2023-7-14 04:48
Hello
same problem with proteus simulation
LCD screen is empty
Speed regulation not possible
Proteus 8.16 SP0
Any advice ?
Thank you
作者: Kara-kala-10 时间: 2023-7-17 16:12
Hello Friends
please if some one can help me fix this error LCD screen is empty speed regulation :0
proteus 8
作者: sev3n 时间: 2024-5-19 12:10
Kara-kala-10 发表于 2023-7-17 16:12
Hello Friends
please if some one can help me fix this error LCD screen is empty speed regulation : ...
use proteus 8.7 would fix this problem
作者: sev3n 时间: 2024-5-19 12:13
mick32 发表于 2023-7-14 04:48
Hello
same problem with proteus simulation
LCD screen is empty
i tried to use proteus 8.15 to simulate this project but it just doesnt work. then i checked the version of the original project, its 8.7, so i use proteus 8.7 and everything runs correctly.
作者: donglw 时间: 2024-5-19 13:41
没有画MOS管的体二极管,R1~R6通常不画。
作者: Alexayo 时间: 2024-7-4 23:50
学习一下谢谢!!
作者: 画里的人 时间: 2025-6-6 09:10
太牛了 太急了哈
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |