Transcript DCmotor

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
Control
Logic 0
PCLK
8-bit
prescaler
1/16
1/32
1/64
1/128
TCLK0
PWM 0
TOUT0
Dead zones
generator
Dead Zone
TCMPB1 TCNTB1
TOUT1
PWM 1
TCMPB2 TCNTB2
PWM 2
8-bit
prescaler
1/16
1/32
1/64
1/128
TCLK0
TCMPB3 TCNTB3
PWM 3
TCNTB4
Control
Logic 4
Dead Zone
TOUT2
• TCNTB: Time counter buffer
register for clock period
TOUT3
• TCMPB: Time compare buffer
register for PWM pulse width
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
Duty cycle
25%
Pulse width
Average value
5V
μP
1.25
PWM
50%
2.5
75%
3.75
HL Chan, EE, CGU
Interfacing 6
DC motor connection
GPIO registers
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)