本实验通过sysfs文件系统操作GPIO同时利用sysfs接口操作PWM,再配合电机驱动芯片完成RK3566泰山派(linux系统)对直流电机的pwm调速。
一、直流电机与电机驱动芯片TB6612
直流电机属于大功率器件,GPIO口无法直接驱动,需要配合电机驱动电路来操作,在这里使用TB6612直流电机驱动芯片来辅助泰山派驱动直流电机。
本次实验中,需要用到的TB6612引脚分别为:①VM-驱动电压输入端(接5V)②VCC-逻辑电平输入端(接3V3)③GND-电源地端 ④STBY-状态控制输入端(接3V3)⑤PWMA-PWM信号输入端 ⑥AIN1和AIN2-电机控制模式输入端 ⑦A01和A02-电机驱动输出端
二、泰山派40PIN引脚选用
本实验选用33号引脚的PWM8_M0功能,38号引脚GPIO3_B3,30号引脚GPIO_B4以及部分电压和GND引脚
三、使用sysfs控制GPIO
1、使用sysfs控制GPIO 首先需要底层驱动的支持,需要在make menuconfig图形化配置界面中加入配置Device Drivers > GPIO Support > /sys/class/gpio/...(sysfs interface),*代表选中
2、sysfs控制接口
启动开发板
/sys/class/gpio/export 将GPIO控制权从内核空间导出到用户空间(只写)
/sys/class/gpio/unexport 取消GPIO控制从内核空间到用户空间的导出(只写)
gpiochipx (x=0,1,2...) 代表GPIO控制器
3、gpio控制接口
在/sys/class/gpio/gpioN/(N=0,1,2...)下有多种属性,可以通过这些属性进行控制,从而实现对GPIO的控制。
direction属性:值为in或者out。可以通过该属性写入in或者out设置该gpio为输入或者输出。
value属性:用于读取输入电平或者控制输出电平。写入或者读取到1表示高电平,写入或者读取到0表示低电平。
edge属性:设置触发电平。在将GPIO设置为中断时才会出现和使用这个属性。
4、泰山派GPIO编号确认
GPIO pin脚计算公式:pin = bank * 32 + number //bank为组号,number为小组编号
GPIO 小组编号计算公式:number = group * 8 + X
依照上述公式计算我们选用的GPIO3_B3和GPIO3_4pin脚的编号
以GPIO3_B4为例:
bank = 3;
group = 1; / / group ∈ { (A=0), (B=1), (C=2), (D=3)}
X = 4;
number = 1 * 8 + 4 = 12;
pin = 3 * 32 + 12 = 108;
同理可得GPIO3_B3pin脚编号为107;
5、使用sysfs控制gpio方法
①导出gpio
echo 107 > export
echo 108 > export
②设置方向
echo out > direction
gpio108同理
③给value属性写1或者0,这里我们给GPIO107和GPIO108分别写上1、0,分别对应控制TB6612模块的AIN1和AIN2
四、通过sysfs接口使用pwm
使用PWM8_M0(官方提供的内核文件中pwm8已经配置好了)
导出pwm8:
cd /sys/calss/pwm/pwmchip1/
echo 0 > export
设置pwm参数即可完成对直流电机的控制(通过修改duty_cycle值可改变电机转速):
cd pwm0/
echo 20000000 > period //设置周期
echo 8000000 > duty_cycle //设置高电平的时间
echo normal > polarity //设置极性,有normal或inversed两个参数选择
echo 1 > enable //使能pwm
关闭pwm:
echo 0 > enable