Belajar mikrokontroller DC Motor Speed and Direction Controller mudah dan sangat berguna yipppppiiiiiii.................


Judul    : : DC Motor Speed and Direction Controller
Tujuan  :
-         Mampu menyusun user requirement untuk sebuah fungsi pengaturan kecepatan    dan arah DC motor.   
-         Mampu   melakukan   identifikasi   unit   input   dan   output   dan   Timer    menggunakan      alamat   PORT   sesuai   konfigurasi   pada   board    praktikum
-          Mampu  menyusun,  menjalankan  dan melakukan  debugging program sesuai    denganpermasalahanberbasisBahasa    pemrogramanC   dengan    menggunakan Keil uVison
Alat  : Personal Computer, modul MCU, Modul DC motor dan rotary encoder,  kabel USB, ST Link    downloader.  
A.Problem :
Akan dibuat sebuah  system  untuk  mengatur  kecepatan  dan  arah  motor    DC  menggunakan PWM. Digunakan keypad untuk mengatur kecepatan dan    arah putaran  serta  LCD  untuk  menampilkan  kecepatan  putaran  motor  DC    saat itu. seperti ditunjukkan pada Gambar 1.



1. Plant Layout:
Plant Layout  Akan dibuat sebuah system untuk mengatur kecepatan dan arah motor DC menggunakan PWM. Digunakan keypad untuk mengatur kecepatan dan arah putaran serta LCD untuk menampilkan kecepatan putaran motor DC saat itu. Untuk mengatur start/stop motor digunakan key “A”, untuk forward/reverse digunakan key “B” dan untuk menaikkan kecepatan digunakan key “C” serta untuk menurunkan kecepatan digunakan key “D” [boleh dirubah]. Kecepatan DC motor dihitung dengan bantuan rotary encoder dan dihubungkan dengan PA.8 difungsikan sebagai external interrupt. Diberikan alarming jika kecepatan motor DC melebihi suatu kecepatan tertentu dengan membunyikan buzzer.


B. User Requirement
User Requirement  Pada plant ini, digunakan untuk pengaturan kecepatan motor DC yang nantinya bisa digunakan untuk beberapa pengaturan yang menggunakan motor. dimana Pengaturan kecepatan ini menggunakan keypad dengan variabel huruf tertentu.









  

]







D. I/O Table
    OUTPUT
No
Device
Address
note
1
LCD
PD0
PD1
PD2
PD3
PD4
PD5
PD6
PD7
Mengetahui kondisi Motor melau layar 16x2
2
BUZZER
PB3

Memberitahukan kondisi MOTOR dalam kondisi lebih dari batas ARR
3
Keypad
PE12
PE13
PE14
PE15
Memulai dan memberhentikan suatu system yang mana sudah di program di dalam mikrokontroler STM32F407VGTX
4
L2930
PB12
PB13
Menentukkan kondisi motor baik forward maupun reverse
5
PWM
PB10
Mengatur duty cyle
6
Ext INT
PA8
External interupt

    INPUT
No
Device
Address
note
1
LCD
PE8
PE9
PE10
PE11
Memasukkan huruf dari keypad menuju mikrokontroller
























































G. Source Code
#include "main.h"
#include "stm32f4xx_hal.h"
#include "stdbool.h"
#include "lcd_character.h"
#include "keypad_4x4.h"

float RPM1;
int PWM1,n;
bool start1,forward1;
char buffer[16],key,num[3];

void SystemClock_Config(void);
static void MX_GPIO_Init(void);

int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
lcd_init();
keypad_init();
HAL_TIM_Base_Start(&htim2);
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_3);
while (1)
  {
if(keypad_get_key_value()=='A')
{
 HAL_Delay(100);
                                                                                   if(keypad_get_key_value()=='A')
 {
  if (start1==false)
start1=true;
else
start1=false;
 }
}
//-------------------------------------------
if(keypad_get_key_value()=='B')
{
 HAL_Delay(100);
                                                                                   if(keypad_get_key_value()=='B')
 {
  if (forward1==false)
forward1=true;
else
forward1=false;
 }
}
//-------------------------------------------
if(keypad_get_key_value()=='C')
{
 HAL_Delay(100);
                                                                                   if(keypad_get_key_value()=='C')
 {
//                                                                                    key=keypad_get_key_value()=='C';
// num[n]=key;
//PWM1=atoi(num);
  PWM1=PWM1+10;
 if (PWM1>=199)
 PWM1=199;
 }
}
//-------------------------------------------                           
if(keypad_get_key_value()=='D')
{
 HAL_Delay(100);
                                                                                   if(keypad_get_key_value()=='D')
 {
  PWM1=PWM1-10;
 if (PWM1<0)
 PWM1=0;
 }
}
//-------------------------------------------                                
if (start1==false) //stop
{ lcd_gotoxy(0,0);
 lcd_puts("M0");
  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_RESET);
  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_RESET);
 TIM2->CCR3=0;
}
if (start1==true && forward1==false)//RUN-reverse
{
 lcd_gotoxy(0,0);
 lcd_puts("M1:RVRE");
 TIM2->CCR3=PWM1;
   HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_SET);
   HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_RESET);

}
if (start1==true && forward1==true)//RUN-forward
{
 lcd_gotoxy(0,0);
 lcd_puts("M1:FWRD");
 TIM2->CCR3=PWM1;
  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_RESET);
  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_SET);
}                                                                               
//---------------------------lcd display
lcd_gotoxy(8,0);
sprintf(buffer,"RPM:%4f",RPM1);
lcd_puts(buffer);
//--------------------------------------buzzer
if (PWM1>=199)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_SET);
}
if (PWM1<=150)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_RESET);
}
 }
  /* USER CODE END 3 */
}
Systick & Interupt

/* Includes ------------------------------------------------------------------
*/
#include "main.h"

#include "stm32f4xx_it.h"

/* Private variables ---------------------------------------------------------
*/
/* USER CODE BEGIN PV */

int j;

int k;

extern float rpm;

extern int i;

void SysTick_Handler(void)

{

MICROCONTROLLER /* USER CODE BEGIN SysTick_IRQn 0 */ j++;
if(j==1000)
{
j=0;

//rpm=((float)pulse1*60.0)/4.0;
rpm=((float)k*60.0)/4.0;
k=0;
}
void EXTI9_5_IRQHandler(void)
{
/* USER CODE BEGIN EXTI9_5_IRQn 0 */
if (i==1)

{
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_8))
{
k++;
}

}
/* USER CODE END EXTI9_5_IRQn 0 */
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_8);

/* USER CODE BEGIN EXTI9_5_IRQn 1 */
/* USER CODE END EXTI9_5_IRQn 1 */
}

H. running test procedure
1. kondisi awal motor off, pada saat tekan keypad huruf ‘A’ maka motor on akan tetapi belum bisa berjalan. Keypad ini seperti toogle yang hanya membutuh kan satu input mempunyai 2 arti.
2.pada saat keypad huruf ‘B’ditekan berguna untuk kondisi putar motor itu ingin orward atau reverse. Keypad ini seperti toogle yang hanya membutuh kan satu input mempunyai 2 arti .
3 pada saat keypad huruf ‘C’ ditekan berguna untuk menambah kondisi putar kecepatan motor yang mana jika ingin menggerakan kecepatan yang sangat cepa maka tekan C sampai batas arr (199) tapi apabila lebih maka buzzer akan menyala atau berbunyi.
4. pada saat keypad huruf ‘D’ ditekan berguna untuk menurunkan kondisi putar kecepatan motor yang mana jika ingin menggerakan kecepatan yang sangat lambat maka tekan D sampai batas arr (0)

LINK VIDIO YOUTUBE  Klik disini









No comments:

Post a Comment

Pages