找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2209|回复: 2
打印 上一主题 下一主题
收起左侧

基于STM32单片机的PWM直流调速系统仿真与程序设计

[复制链接]
跳转到指定楼层
楼主
本帖包含仿真与例程,是基于STM32单片机的PWM直流电机调速,通过定时器3的三通道即B0口输出PWM波,继而通过L298N驱动芯片驱动电机转动,并通过LCD液晶显示电机的状态与挡位。

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include "sys.h"
  2. #include "timer.h"
  3. #include "gpio.h"
  4. #include "key.h"
  5. #include "math.h"
  6. #include "lcd12864.h"

  7. int main(void)
  8. {
  9.      u16 arr=60000;
  10.            u16 psc=2;
  11.      u16 led_dt = 550;
  12.            unsigned char KEY=0;
  13.            int start=0;//电机启停变量
  14.            int D=100;//电机转速调节参数
  15.            int d=1;//电机挡位变量,挡位1-6

  16.                  RCC_Configuration();        //系统时钟初始化
  17.      GPIO_Configuration();//端口初始化
  18.                  TIM3_Configuration(arr,psc);//定时器和pwm配置
  19.      Key_Init();
  20.            Init_12864();                                               //初始化12864液晶
  21.      LCD_DispACat(8,8);
  22.            LCD_P6x8Str(5,45,"PWM-->Motor");
  23.      GPIO_ResetBits(GPIOC,GPIO_Pin_5);
  24.                  GPIO_ResetBits(GPIOC,GPIO_Pin_6);

  25.                  while(1)
  26.                  {                                
  27.                                 TIM_SetCompare3(TIM3,led_dt*D); //用的是TIM3的通道2,输出PWM         送到相应的寄存器中
  28.                           KEY=Key_Scan();
  29. //***********************电机启停***************************//
  30.         if(KEY==67)//C启动
  31.                                 {
  32.                                          delay_ms(1);//延时消抖
  33.                                          start=1;
  34.                        GPIO_SetBits(GPIOC,GPIO_Pin_5);
  35.            GPIO_ResetBits(GPIOC,GPIO_Pin_6);
  36.                                           LCDClearScreen(AllScreen);
  37.                                          LCD_P6x8Str(4,25,"    start    ");
  38.                                 }                 
  39.                           if(KEY==68)//D停止
  40.                                 {
  41.                                          start=0;
  42.                        GPIO_ResetBits(GPIOC,GPIO_Pin_5);
  43.            GPIO_ResetBits(GPIOC,GPIO_Pin_6);
  44.                                           LCDClearScreen(AllScreen);
  45.                                    LCD_P6x8Str(4,25,"    stop     ");
  46.                                 }               
  47. //*********************电机正反转***************************//
  48.                          if((KEY==42)&&(start==1))//“*”的ascll码是42,控制电机反转
  49.                                 {
  50.                                         GPIO_SetBits(GPIOC,GPIO_Pin_6);
  51.           GPIO_ResetBits(GPIOC,GPIO_Pin_5);
  52.                                         LCDClearScreen(AllScreen);
  53.                                         LCD_P6x8Str(4,11,"Negative Direction");
  54.                                 }
  55.                           if((KEY==35)&&(start==1))//“#”的ascll码是35,控制电机正转
  56.                                 {
  57.                                         GPIO_SetBits(GPIOC,GPIO_Pin_5);
  58.           GPIO_ResetBits(GPIOC,GPIO_Pin_6);
  59.                                         LCDClearScreen(AllScreen);
  60.                                         LCD_P6x8Str(4,11,"Positive Direction");
  61.                                 }
  62. //**********************电机加减速**************************//
  63.                                 if((KEY==65)&&(start==1))//A加速
  64.         {
  65.                                         D=D-20;
  66.                                         d++;
  67.                                         if(D<10)
  68.                                         {
  69.                                                 D=0;
  70.                                                 d=6;
  71.                                         }
  72.                                         LCDClearScreen(AllScreen);
  73.                                         LCD_P6x8Str(4,27,"  Speed up   ");
  74.                                 }
  75.                                 if((KEY==66)&&(start==1))//B减速
  76.         {
  77.                                         D=D+20;
  78.                                         d--;
  79.                                         if(D>100)
  80.                                         {
  81.                                                 D=100;
  82.                                                 d=1;
  83.                                         }
  84.                                         LCDClearScreen(AllScreen);
  85.                                         LCD_P6x8Str(4,27,"  Slow down  ");
  86.                                 }
  87.                                 if(start!=0)
  88.                                 {
  89.                                         Key_Gear(d);
  90.                                 }
  91. //                                        if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_7)== Bit_RESET)
  92.                  }        
  93. }
复制代码

屏幕可以显示,但是电机不转,求帮助:
Desktop.7z (283.04 KB, 下载次数: 41)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

来自 3#
ID:421625 发表于 2021-4-21 12:41 | 只看该作者
我是作者,俺也不知道咋回事,就是在加LCD之前都还是好好的,加了之后就感觉仿真带不动了一样,其实我感觉整个程序和仿真应该没有问题,但是屏蔽关于LCD的代码也不管用了。电机是转的,要先点启动键,才能执行其他操作,但是一点启动键就会变很卡,建议打开示波器会看的明显一些,再然后你点加速会在卡一会后观察到PWM波形占空比发生变化。
回复

使用道具 举报

沙发
ID:328014 发表于 2021-4-20 19:23 | 只看该作者
不管按哪个键,电机都不转,问题大概在哪里?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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