120 likes | 202 Views
Emblinux. DC-MOTOR. 利用 tftp 把 host 和 target 連接 Run kernel Run rootfs. 拷貝 driver 到 linux 中 用 make 得到 ko 檔 ( 驅動 ) 在用 /usr/local/arm/3.4.1/bin/arm-linux-gcc –o xx_test xx_test.c 可得 xx_test( 測試檔 ). Dc motor. 如同 pwm 一樣用 duty cycle 控制轉速 程式如下 ( 在附件 ) dc_motor.c dc_motor_test.c.
E N D
Emblinux DC-MOTOR
利用tftp把host和target連接 • Run kernel • Run rootfs
拷貝driver到linux中 • 用make得到ko檔(驅動) • 在用/usr/local/arm/3.4.1/bin/arm-linux-gcc –o xx_test xx_test.c可得xx_test(測試檔)
Dc motor • 如同pwm一樣用duty cycle控制轉速 • 程式如下(在附件) dc_motor.c dc_motor_test.c
PWM and timer in Samsung S3C2410X TCMPB0 TCNTB0 PWM 0 TOUT0 Control Logic 0 Dead zones generator 1/16 1/32 1/64 1/128 TCLK0 Dead Zone PCLK 8-bit prescaler TCMPB1 TCNTB1 TOUT1 PWM 1 TCMPB2 TCNTB2 Dead Zone PWM 2 TOUT2 • TCNTB: Time counter buffer register for clock period • TCMPB: Time compare buffer register for PWM pulse width TCMPB3 TCNTB3 1/16 1/32 1/64 1/128 TCLK0 PWM 3 TOUT3 8-bit prescaler TCNTB4 Control Logic 4 No pin
Pulse-width modulation (PWM) • DC motor control: Rotation speed proportional to input voltage level • DC-to-DC converter • Digital-to-analog converter • PWM (use average voltage) • Use pulse width as control command to output device 5V Duty cycle Average value Pulse width μP 25% 1.25 PWM 50% 2.5 75% 3.75
set_pwm3函數:完成對直流馬達的脈波比調節。參數hiratio為占空百分比(0~100) static void set_pwm3(unsigned char hiratio) { unsigned long tcnt; printk("hiratio = %d",hiratio); tcnt =( 96000000 )/( FREQ_PWM1 *16 ); __raw_writel(((tcnt*(hiratio))/100), S3C2410_TCMPB(3)); }
dcm_ioctl函數:透過呼叫set_pwm3函數,傳送不同的脈波比參數,對直流馬達的速度進行10級調節 static int dcm_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { switch(cmd) { case DC_IOCTL_START: set_pwm3(DUTY); break; case DC_IOCTL_STOP: set_pwm3(0); printk("off\n"); break; case DC_IOCTL_SPEED_UP: DUTY +=STEP; if (DUTY>MAX_VAL) DUTY=MAX_VAL; set_pwm3(DUTY); break; case DC_IOCTL_SPEED_DOWN: DUTY -=STEP; if (DUTY<0) DUTY=0; set_pwm3(DUTY); printk("PWM_IOCTL_SPEED_DOWN\n"); break; default : break; } return 0; }
對dcm_ioctl的參數初始化 • #define MAX_VAL 90 • static int DUTY = 50; • static int STEP=10;
作業 • 不要透過uart而改變馬達轉速(DUTY:0~100)