📄 ads7816.c
字号:
//SPI初始化
void ads7816_init(void)
{
PORTB = 0b11111111;//打开MISO的内部上拉电阻
DDRB = 0b11110111;//SS,SCK,MOSI设置为输出,MISO(Dout)设置为输入
//SPCR = 0x11010011;//SPI中断允许,SPI允许,高位在先,主机模式,f/128
//SPSR = 0x00;//单倍速模式
}
//一次AD采样
uint ads7816(void)
{
uchar i,data;
uint out= 0;
PORTB |= _BV(CS);
PORTB |= _BV(CLK);
PORTB &= ~_BV(CS); //CS拉低,开始采样
PORTB &= ~_BV(CLK);
PORTB |= _BV(CLK);
PORTB &= ~_BV(CLK);
PORTB |= _BV(CLK);
PORTB &= ~_BV(CLK);
PORTB |= _BV(CLK);
for (i=0;i<12;i++)
{
PORTB &= ~_BV(CLK);
data = PINB;
if (data & 0b00001000)
{
out |= (0x0800>>i);
}
PORTB |= _BV(CLK);
}
PORTB |= _BV(CS);
return out;
}
*/
//ADS7816操作严格按照时序进行
//SPI初始化
void ads7816_init(void)
{
//SPI初始化,ADS7816
PORTB = 0b11111111;//打开MISO的内部上拉电阻
DDRB = 0b11110111;//SS,SCK,MOSI设置为输出,MISO(Dout)设置为输入
SPCR = 0b01010000;//SPI允许,高位在先,主机模式,f/4
SPSR = 0x00;//单倍速模式
}
uint ads7816(void)
{
uint c=0;
uint out= 0;
PORTB |= _BV(CS);
//开始采样
PORTB &= ~_BV(CS);
SPDR = 0x00;
loop_until_bit_is_set(SPSR,7);
c = SPDR&(0b01111111)&(0b10111111);//前三位无效,从第四位开始B11,B10...
out = c;//第一次取得5个有效位
out = out<<7;
SPDR = 0x00;
loop_until_bit_is_set(SPSR,7);
c = SPDR;//第二次取得7个有效位
out += (c>>1);
//结束采样
PORTB |= _BV(CS);
return out;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -