基於STM32神舟系列開發板的讀取絕…

#include "stm32f10x.h"
#include "stm32f10x_usart.h"
#include
#include
#include

#define CMD_BUFFER_LEN 100

GPIO_InitTypeDef GPIO_InitStructure;
void Delay(__IO uint32_t nCount)
{
  for(; nCount != 0; nCount--);
}
void RCC_Config(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
}

void GPIO_Config(void)
{
//串口 PA9 PA10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                       //管腳9 
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;     //複用推輓輸出 
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);                             //TX初始化 
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;                     //管腳10 
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空輸入 
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);                              //RX初始化

//絕對值碼盤 PC1/clk, PC2/cs, PC3/data
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //浮空輸入,TIM3的ch1和ch2通道
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空輸入,TIM3的ch1和ch2通道
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}

void USART_Config(void)
{
USART_InitTypeDef USART_InitStructure;
//模擬激光測試時改波特率爲 38400
USART_ClockInitTypeDef USART_ClockInitStructure;
USART_InitStructure.USART_BaudRate = 115200;                                  //波特率9600 
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//無流控制 
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //字長8位 
USART_InitStructure.USART_StopBits = USART_StopBits_1;                  //1位停止字節 
USART_InitStructure.USART_Parity = USART_Parity_No;                    //無奇偶校驗 
USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;//打開Rx接收和Tx發送功能 
USART_Init(USART1, &USART_InitStructure);
USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE);//允許DMA                 //初始化 
USART_Cmd(USART1, ENABLE);
}


void myprintf(USART_TypeDef* USARTx, char *fmt, ...)
{
char buffer[CMD_BUFFER_LEN + 1];  // CMD_BUFFER_LEN長度自己定義吧
u8 i = 0;
va_list arg_ptr;
va_start(arg_ptr, fmt);
vsnprintf(buffer, CMD_BUFFER_LEN + 1, fmt, arg_ptr);
while ((i < CMD_BUFFER_LEN) && buffer[i])
{
USART_SendData(USARTx, (u8)buffer[i++]);
while (USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);
}
va_end(arg_ptr);
}

int main(void)
{
s32 b = 0;
int c = 0;
RCC_Config();
GPIO_Config();
USART_Config();
GPIO_SetBits(GPIOC, GPIO_Pin_2);
GPIO_ResetBits(GPIOC, GPIO_Pin_1);
while (1)
{
int i = 0;
u32 abs_encoder_data = 0; //u16
s32 a = 0;
u32 g_abs_encoder_data_new = 0, g_abs_encoder_data_old, g_abs_encoder_data;
GPIO_ResetBits(GPIOC, GPIO_Pin_2);
//b=a;
for(i = 0; i < 72; i ++)
{
//clk
if(i%4==0)
GPIO_SetBits(GPIOC, GPIO_Pin_1);
else
GPIO_ResetBits(GPIOC, GPIO_Pin_1);
//read
if(i%4==2)
abs_encoder_data |= (GPIOC->IDR&GPIO_Pin_3)>>3;
//myprintf(USART1,"%d%d\n" ,GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_3),(GPIOC->IDR&GPIO_Pin_3)>>3);
abs_encoder_data <<= 1; 
//myprintf(USART1,"%d",GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_3));
}
GPIO_SetBits(GPIOC, GPIO_Pin_2);
g_abs_encoder_data_old = g_abs_encoder_data_new;
if
(
((abs_encoder_data & 0x003E) == 0x0020)//111110  
|| ((abs_encoder_data & 0x003E) == 0x0022) //34 100010
|| ((abs_encoder_data & 0x003E) == 0x0024) //36   100100
)
{
g_abs_encoder_data_new = (abs_encoder_data & 0x3FFFF) >> 6;
a = g_abs_encoder_data_new - g_abs_encoder_data_old;
if ((a - b)>900)
c -= 1;
if ((b - a)>900)
c += 1;
g_abs_encoder_data += a;
b=a;
//myprintf(USART1, "%d\t", a);
//myprintf(USART1, "%d\n", b);
if (c >= 0)
{
myprintf(USART1, "%d圈\t", c);
myprintf(USART1, "%d格\n", a);
}
else if (c<0)
{
myprintf(USART1, "%d圈\t", c + 1);
myprintf(USART1, "%d格\n", a - 4096);
//g_abs_encoder_data = 7;
}
// myprintf(USART1, "%d\n", a); 
}
}
}

發佈了36 篇原創文章 · 獲贊 65 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章