找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2880|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

基于STM32單片機(jī)的PWM直流調(diào)速系統(tǒng)仿真與程序設(shè)計(jì)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
本帖包含仿真與例程,是基于STM32單片機(jī)的PWM直流電機(jī)調(diào)速,通過定時(shí)器3的三通道即B0口輸出PWM波,繼而通過L298N驅(qū)動(dòng)芯片驅(qū)動(dòng)電機(jī)轉(zhuǎn)動(dòng),并通過LCD液晶顯示電機(jī)的狀態(tài)與擋位。

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


單片機(jī)源程序如下:
  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;//電機(jī)啟停變量
  14.            int D=100;//電機(jī)轉(zhuǎn)速調(diào)節(jié)參數(shù)
  15.            int d=1;//電機(jī)擋位變量,擋位1-6

  16.                  RCC_Configuration();        //系統(tǒng)時(shí)鐘初始化
  17.      GPIO_Configuration();//端口初始化
  18.                  TIM3_Configuration(arr,psc);//定時(shí)器和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         送到相應(yīng)的寄存器中
  28.                           KEY=Key_Scan();
  29. //***********************電機(jī)啟停***************************//
  30.         if(KEY==67)//C啟動(dòng)
  31.                                 {
  32.                                          delay_ms(1);//延時(shí)消抖
  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. //*********************電機(jī)正反轉(zhuǎn)***************************//
  48.                          if((KEY==42)&&(start==1))//“*”的ascll碼是42,控制電機(jī)反轉(zhuǎn)
  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,控制電機(jī)正轉(zhuǎn)
  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. //**********************電機(jī)加減速**************************//
  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. }
復(fù)制代碼

屏幕可以顯示,但是電機(jī)不轉(zhuǎn),求幫助:
Desktop.7z (283.04 KB, 下載次數(shù): 42)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

來自 3#
ID:421625 發(fā)表于 2021-4-21 12:41 | 只看該作者
我是作者,俺也不知道咋回事,就是在加LCD之前都還是好好的,加了之后就感覺仿真帶不動(dòng)了一樣,其實(shí)我感覺整個(gè)程序和仿真應(yīng)該沒有問題,但是屏蔽關(guān)于LCD的代碼也不管用了。電機(jī)是轉(zhuǎn)的,要先點(diǎn)啟動(dòng)鍵,才能執(zhí)行其他操作,但是一點(diǎn)啟動(dòng)鍵就會(huì)變很卡,建議打開示波器會(huì)看的明顯一些,再然后你點(diǎn)加速會(huì)在卡一會(huì)后觀察到PWM波形占空比發(fā)生變化。
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:328014 發(fā)表于 2021-4-20 19:23 | 只看該作者
不管按哪個(gè)鍵,電機(jī)都不轉(zhuǎn),問題大概在哪里?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表