1、查看X9313手册
这就是个滑动变阻器的电动版。
每滑动一次就改变一次电压,往电压高或者低的方向滑动,最多只能滑动 1 - 31 次。
每滑动一次,Vw管脚的电压就增加或减少 0.106V。
手册说CS片选管脚为高电平,就啥也干不了。
当CS为低电平,UD为高电平,INC从高电平变为低电平一次,就向高电平方向滑动一次。
当CS为低电平,UD为低电平,INC从高电平变为低电平一次,就向低电平方向滑动一次。
当CS由低电平变为高电平,INC管脚为高电平,x9313保存当前滑动位置(此滑动位置就是下次滑动时候的初始位置)。
当CS由低电平变为高电平,INC管脚为低电平,x9313不保存当前滑动位置,返回到初始滑动位置。
2、查看电路连接
3、驱动代码
bzq.h
#ifndef _BZQ_H
#define _BZQ_H
//#include "添加你自己的各种头文件.h"
/***********************变阻器GPIO定义******************************************/
#define BZQ_CS_1M PBout(7)
#define BZQ_UP_1M PBout(6)
#define BZQ_INC_1M PBout(5)
void Bzq_Up_I(u8 arg);
void Bzq_Down_I(u8 arg);
void Bzq_SetVal(u8 channel, u8 arg);
#endif
bzq.c
#include "bzq.h"
/****************************************************
函数名:GPIO_X9313WPI_Config()
形参:
返回值:
函数功能:滑动变阻器的IO口初始化
PB5 -- INC_1
PB6 -- UP_1
PB7 -- CS_1
****************************************************/
void GPIO_X9313WPI_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStruct);
}
/*******************************
* 函 数 名: void Bzq_Up(u8 arg)
* 功能说明: 变阻器设置向上滑动
* 形 参: arg 滑动次数
* 返 回 值: 无
*******************************/
void Bzq_Up(u8 arg)
{
u8 i=0;
BZQ_CS_1M = 0;//片选有效
BZQ_INC_1M = 0;
MYDelay_ms(5);//自己随便写个延时函数延时5ms
BZQ_UP_1M = 1;//向高端滑动
MYDelay_ms(5);//自己随便写个延时函数延时5ms
for(i = 0; i<arg; i++)
{
BZQ_INC_1M = 1;
MYDelay_ms(5);//自己随便写个延时函数延时5ms
BZQ_INC_1M = 0;
MYDelay_ms(5);//自己随便写个延时函数延时5ms
}
BZQ_INC_1M = 1;//保存
MYDelay_ms(5);//自己随便写个延时函数延时5ms
BZQ_CS_1M = 1;//片选无效
MYDelay_ms(10);
}
/*******************************
* 函 数 名: void Bzq_Down(void)
* 功能说明: 变阻器设置向下滑动
* 形 参: arg 滑动个数
* 返 回 值: 无
*******************************/
void Bzq_Down(u8 arg)
{
u8 i =0;
BZQ_CS_1M = 0;//片选有效
BZQ_INC_1M = 0;
MYDelay_us(5);
BZQ_UP_1M = 0;//向低端滑动
MYDelay_us(5);
for(i = 0; i<arg; i++)
{
BZQ_INC_1M = 1;
MYDelay_us(5);
BZQ_INC_1M = 0;
MYDelay_us(5);
}
BZQ_INC_1M = 1;//保存
MYDelay_ms(5);
BZQ_CS_1M = 1;//片选无效
MYDelay_ms(10);
}
/*******************************
* 函 数 名: void Bzq_SetVal( u8 arg)
* 功能说明: 变阻器设置滑动次数
* 形 参: arg 滑动个数
* 返 回 值: 无
*******************************/
u8 tempNow = 0;//全局变量 保存按键第一次调节的数 如果第一次没调节就初始值为0
u8 tempLast = 0;//全局变量 保存按键第二次调节的数
u8 cir=0;//调节次数 由两个按键的数值之差决定
void Bzq_SetVal(u8 arg)
{
if(tempNow<tempLast)//如果 1 < 2
{
cir = tempLast - tempNow;
Bzq_Up(cir);//滑动变阻器向电压增大的方向滑动
}
else
{
cir = tempNow - tempLast;
Bzq_Down(cir);//滑动变阻器向电压减小的方向滑动
}
}
main.c
int main(void)
{
u8 i = j =0;
GPIO_X9313WPI_Config();
for(i=1; i<31; i++)
{
Bzq_Down(i);//滑动31次 - 0V 滑动30次-0.1V 大概这样
}
for(j=1; j<30; j++)
{
Bzq_Up(j);//滑动一次 增大一次电压
}
}
STM32F1连接X9313的测试代码试了一下,
发现贴片封装的9313调节出来测试的Vw管脚的电平按照理论值变化,
插片封装的9313就不能调节,好像插片封装的9313需要5v供电,也可能是忘了供电了。。。
反正只能在1-31次直接滑动,超过这个次数 滑动变阻器不会改变。
来源:CSDN
作者:王木木界
链接:https://blog.csdn.net/sinat_24880087/article/details/103937079