本文为原创文章,转载需要注明转载出处

 前言:嵌入式开发是相比其他IT行业是比较难的行业,它不仅需要你去掌握软件的经验,还要去学习一些硬件的知识,

它是软件和硬件的一个粘合剂,起到一个至关重要的地位

下面我们接着讲第二弹 

【STM32】【C】【嵌入式】分享一下我的项目经验--基于stm32桌面主从机械臂设计(一弹)

【STM32】【C】【嵌入式】分享一下我的项目经验--基于stm32桌面主从机械臂设计(二弹)

【STM32】【C】【嵌入式】分享一下我的项目经验--基于stm32桌面主从机械臂设计(三弹)

目录

2.4 电位器

2.4.1 电位器概述

 2.4.2 电位器的连接使用

主从机械臂代码


2.4 电位器

2.4.1 电位器概述

电位器是具有三个引出端、阻值可按某种变化规律调节的电阻元件。电位器通常由电阻体和可移动的电刷组成。当电刷沿电阻体移动时,在输出端即获得与位移量成一定关系的电阻值电压

电位器既可作三端元件使用也可作二端元件使用。后者可视作一可变电阻器,由于它在电路中的作用是获得与输入电压(外加电压)成一定关系得输出电压,因此称之为电位器。

 2.4.2 电位器的连接使用

ADC采集电压值,可以通过采集电位器的电压值来得知转过的角度。

下图是一个电位器,也就是个滑动变阻器。

 

vcc接f103c8t6的3.3v,GND接f103c8t6上面的GND,OUT输出口,接f103c8t6的ADC通道的一个引脚,这里为PA1管脚

3.3v->120度

采集到的ADC的值和电压值最大值。

最小都为0。

根据采集到的数据,需要对ADC的值或者电压值转换为角度,

进行大致的估算。

电位器转1°,ADC(1°)=4094/120≈34.133 ,近似等于34个ADC。

电压V(1°)=3.298/120≈0.0275,近似等于0.028v

画下ADC采集电位器电压的流程图

主从机械臂代码

下面是/*adc.h*/

#ifndef __ADC_H__
#define __ADC_H__
#include "sys.h"
#include "delay.h"
void Adc_Init(void);

u16 Get_Adc(u8 ch);
u16 Get_Adc_Average(u8 ch,u8 times);
#endif //__ADC_H__

下面是/*adc.c*/

#include "adc.h"


void Adc_Init(void)//ADC???
{
    GPIO_InitTypeDef GPIO_InitStructure;
    ADC_InitTypeDef ADC_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1,ENABLE);//RCC->APB2ENR|=1<<2;RCC->APB2ENR|=1<<9;??PORTA??ADC1?? 


#if 1	
//ADC1²É¼¯µçѹ  PA1 ×óµçλÆ÷  »úе±ÛС±Û	
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;
	  RCC_ADCCLKConfig(RCC_PCLK2_Div6);  //RCC->CFGR&=~(3<<14);RCC->CFGR|=2<<14; 6??ADC???12M
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);//GPIOA->CRL&=0X0FFFFFFF PA7????

    


#endif

#if 1
//ADC2²É¼¯ÅäÖà PA2   ÓÒµçλÆ÷  »úе±Û´ó±Û
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;
	  RCC_ADCCLKConfig(RCC_PCLK2_Div6);  //RCC->CFGR&=~(3<<14);RCC->CFGR|=2<<14; 6??ADC???12M
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);//GPIOA->CRL&=0X0FFFFFFF PA7????

    

//ADC3²É¼¯ÅäÖà PA3  µ×Å̵çλÆ÷ µ×ÅÌ
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;
	  RCC_ADCCLKConfig(RCC_PCLK2_Div6);  //RCC->CFGR&=~(3<<14);RCC->CFGR|=2<<14; 6??ADC???12M
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);//GPIOA->CRL&=0X0FFFFFFF PA7????

    



#endif
	  ADC_DeInit(ADC1);//RCC->APB2RSTR|=1<<9; ADC1??

    ADC_InitStructure.ADC_Mode=ADC_Mode_Independent; //ADC1->CR1&=0XF0FFFF;ADC1->CR1|=0<<16; ??????
    ADC_InitStructure.ADC_ScanConvMode=DISABLE;//ADC1->CR1&=~(1<<8); ?????
    ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;//ADC1->CR2=~(1<<1); ??????
    ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//ADC1->CR2&=~(7<<17);ADC1->CR2|=7<<17;?????? ADC1->CR2|=1<<20; ??????
    ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//ADC1->CR2&=~(1<<11);???
    ADC_InitStructure.ADC_NbrOfChannel=1;//ADC1->SQR1&=~(0XF<<20); ADC1->SQR1|=0<<20;//?????????ADC?????1
    ADC_Init(ADC1,&ADC_InitStructure);//??ADC_InitStructure???????????ADC????

    ADC_Cmd(ADC1,ENABLE);//ADC1->CR2|=0;??ADC1
    ADC_ResetCalibration(ADC1); //ADC1->CR2|=1<<3;??????
    while(ADC_GetResetCalibrationStatus(ADC1));//while(ADC1->CR2&1<<3)????????
    ADC_StartCalibration(ADC1);//ADC1->CR2|=1<<2;??AD??
    while(ADC_GetCalibrationStatus(ADC1));//while(ADC1->CR2&1<<2)??????
		
}
//ADC1
/*------------------------ADC1--down-------------------*/
u16 Get_Adc(u8 ch)   
{
    //????ADC??????,????,????
    //ADC1->SMPR2&=~(7<<21);ADC1->SMPR2|=7<<21;ADC1,ADC??,?????239.5??
    //ADC1->SQR3&=0XFFFFFFE0;ADC1->SQR3|=ch;
    ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );  

    ADC_SoftwareStartConvCmd(ADC1, ENABLE);     //?????ADC1?????????    

    //while(!(ADC1->SR&1<<1)); 
   
    while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));

    //return ADC1->DR
    //??????ADC1????????
    return ADC_GetConversionValue(ADC1);
}

u16 Get_Adc_Average(u8 ch,u8 times)
{
    u32 temp_val=0;
    u8 t;
    for(t=0;t<times;t++)
    {
        temp_val+=Get_Adc(ch);
        

    }
    return temp_val/times;
}    

 

下面是/*blue.h*/

#ifndef __BLUE_H__
#define __BLUE_H__	 
#include "sys.h"
#include "stdarg.h"	 	 
#include "stdio.h"	 	 
#include "string.h"	 
#include "usart.h"

void BLUE_Init(void);//³õʼ»¯
//void RCC_Configuration(void);    
//void GPIO_Configuration(void);   
//void USART_Configuration(void);   

//void UART_PutChar(USART_TypeDef* USARTx, uint8_t Data);  
//void UART_PutStr (USART_TypeDef* USARTx, uint8_t *str);
//int Putchar(int c);
void USART1_IRQHandler(void);	

#endif

下面是/*blue.c*/

#include "blue.h"
//#include "usart.h"
#include "delay.h"
#define USART_REC_LEN  			200  
u8  USART_RX_BUF[USART_REC_LEN]; 
char BUF[5] = {0x59,0x65,0x73};
char BUF2[5];

//u16 USART_RX_STA;
u16 USART_RX_STA=0;  


void BLUE_Init(void){
	
	GPIO_InitTypeDef GPIO_InitStrue;
	USART_InitTypeDef USART_InitStrue;
	NVIC_InitTypeDef NVIC_InitStrue;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//?
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
	
	GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIO_InitStrue.GPIO_Pin=GPIO_Pin_9;
	GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
  GPIO_Init(GPIOA,&GPIO_InitStrue);//?
	
	GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IPU;//GPIO_Mode_IN_FLOATING;
	GPIO_InitStrue.GPIO_Pin=GPIO_Pin_10;
	GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
  GPIO_Init(GPIOA,&GPIO_InitStrue);//?
	
	USART_InitStrue.USART_BaudRate=9600;
	USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
	USART_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;
	USART_InitStrue.USART_Parity=USART_Parity_No;
	USART_InitStrue.USART_StopBits=USART_StopBits_1;
	USART_InitStrue.USART_WordLength=USART_WordLength_8b;
	
	USART_Init(USART1,&USART_InitStrue);//?
	
	USART_Cmd(USART1,ENABLE);//????1
	#if 1
	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//??????
	
	NVIC_InitStrue.NVIC_IRQChannel=USART1_IRQn;
	NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;
	NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=3;
	NVIC_InitStrue.NVIC_IRQChannelSubPriority=3;
	NVIC_Init(&NVIC_InitStrue);
#endif


}
#if 1
void USART1_IRQHandler(void)
{	 u8 a= 0;
	 u8 Res;
	 if(USART_GetITStatus(USART1,USART_IT_RXNE)!= RESET)
 {
     Res= USART_ReceiveData(USART1);
		//USART_SendData(USART1,Res); 	 
		//printf("jieshoudaole");
#if 1
		 if((USART_RX_STA & 0x8000)== 0){
				if(USART_RX_STA&0x4000){
					if(Res!=0x0a)
						USART_RX_STA=0;
					else {
						USART_RX_STA|=0x8000;	
						//printf("jieshoudaole");
						//USART_SendData(USART1,Res);
					}	
						//USART_SendData(USART1,Res);
					
				}
				else{
					if(Res==0x0d)
						USART_RX_STA|=0x4000;
					else
						{
							USART_RX_BUF[USART_RX_STA&0X3FFF]=Res;
							if((USART_RX_BUF[USART_RX_STA&0X3FFF] == 0x6f)){
								 BUF2[0] = 0x6f;
							
							}
							if((USART_RX_BUF[(USART_RX_STA)&0X3FFF] == 0x6b )){
							
								BUF2[1] = 0x6b;
							
							}
							if(BUF2[0] == 0x6f && BUF2[1] == 0x6b){
										while(BUF[a] != 0){
										USART_SendData(USART1,BUF[a]);
										while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET){}
										a++;
										BUF2[0] = 0;
										BUF2[1] = 0;
							
							}

								//USART_RX_STA++;
									
	
								
							
							}
							//USART_SendData(USART1,USART_RX_BUF[USART_RX_STA&0X3FFF] );  //send ok
							USART_RX_STA++;
							a++;
						
							if(USART_RX_STA>(USART_REC_LEN-1))
								USART_RX_STA=0;	  
							
						}		 				
				//USART_SendData(USART1,Res);   //send ok
				}	 
		 }
#endif 
     //USART_SendData(USART1,res);   
	 }
}
 

 #endif
int Putchar(int c)                                             
{    
    if (c == '\n'){putchar('\r');}                                
    USART_SendData(USART1,c);                                  
    while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
    return c;                                                       
}   
void UART_PutChar(USART_TypeDef* USARTx, uint8_t Data)  
{  
    USART_SendData(USARTx, Data);  
    while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET){}  
}  
void UART_PutStr (USART_TypeDef* USARTx, uint8_t *str)    
{   //str--;
    while (0 != *str)    
    {    
        UART_PutChar(USARTx, *str++);    
        //str++;      
    }    
}  

下面是/*main.c*/

#include "stm32f10x.h"
#include "delay.h"
#include "sys.h"
#include <stdio.h>
#include "blue.h"
#include "adc.h"
int fputc(int ch,FILE *p)  //

{

USART_SendData(USART1,(u8)ch);

while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);

return ch;

}











char BUF3[5] = {0x0d,0x59,0x65,0x73};
u16 adcx,adcx2,adcx3,adcx_tmp,adcx_tmp2,adcx_tmp3;
u16 x,x2,x3; //Ôö¼õÁ¿
char a,a2,a3; //´ú±íÕý¸º 1ΪÕý 2Ϊ¸º
int n,n2,n3; //´ú±íµçλÆ÷ת¶àÉÙ¶È  0-120¶È
char bf[2],bf2[2],bf3[2];
char *sn =bf,*sn2=bf2,*sn3=bf3;


float temp,temp2,temp3;
void TIM3_Int_Init(u16 arr,u16 psc)
{
 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //??? TIM3 ??
 
//??? TIM3 ???
TIM_TimeBaseStructure.TIM_Period = arr; //??????????????
TIM_TimeBaseStructure.TIM_Prescaler =psc; //?????????????
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //??????
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM ????
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //???? TIM3
	TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //???????
//????? NVIC ??
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3 ??
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //????? 0 ?
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //???? 3 ?
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ ?????
NVIC_Init(&NVIC_InitStructure); //???? NVIC ???
TIM_Cmd(TIM3, ENABLE); //??? TIM3
}
void TIM3_IRQHandler(void) //TIM3 ÖжϺ¯Êý
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //
{
			TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); 
	    adcx_tmp=Get_Adc_Average(ADC_Channel_1,10);
			if(adcx_tmp > adcx){
				x = adcx_tmp - adcx;
				if(x >= 34){ //Âú×ã´óÓÚתһ¶È£¨34¸öADCÖµ£©
					a = 0x61;
				}
				
				
			}
			else if(adcx_tmp < adcx){
				x = adcx - adcx_tmp;
				if(x >= 34){
					a = 0x62;
				}
				
			}
			else{
				a = 0x30;
				x = 0;
			}
			if(x >= 34){
				n = x / 34;
					if(n < 10){
						//sprintf(sn,"0%d",n);
				}
				else {
						//sprintf(sn,"%d",n);
				}			
			}
			else{
				n = 0;
				//sn = "00";
			}
			adcx = adcx_tmp;
			
		  adcx_tmp2 = Get_Adc_Average(ADC_Channel_2,10);
			if(adcx_tmp2 > adcx2){
				x2 = adcx_tmp2 - adcx2;
				if(x2 >= 34){
					a2 = 0x61;
				}
				
			}
			else if(adcx_tmp2 < adcx2){
				x2 = adcx2 - adcx_tmp2;
				if(x2 >= 34){
					a2 = 0x62;
				}
			}
			else{
				x2 = 0;
				a2 = 0x30;
			}
			if(x2 >= 34){
				n2 = x2 / 34;
				if(n2 < 10){
						//sprintf(sn2,"0%d",n2);
				}
			
				else {
						//sprintf(sn2,"%d",n2);			
					}
				}
			else{
				n2 = 0;
				//sn2 = "00";
			}
			
			adcx2 = adcx_tmp2;
			
			adcx_tmp3 = Get_Adc_Average(ADC_Channel_3,10);
			if(adcx_tmp3 > adcx3){
				x3 = adcx_tmp3 - adcx3;
				if(x3 >= 34){
					a3 = 0x61;
				}
			}
			else if(adcx_tmp3 < adcx3){
				x3 = adcx3 - adcx_tmp3;
				if(x3 >= 34){
					a3 = 0x62;
				}
			}
			else{
				x3 = 0;
				a3 = 0x30;
			}
			if(x3 >= 34){
				n3 = x3 / 34;
				if(n3 < 10){
						//sprintf(sn3,"0%d",n3);
				}
				else {
						//sprintf(sn3,"%d",n3);
				}
			}
			else{
				n3 = 0;
	
			}
			adcx3 = adcx_tmp3;
	    //printf("ADC1:%d ADC2:%d ADC3:%d\r\n",adcx,adcx2,adcx3);
			//printf("a:%d,x1:%d a2:%d,x2:%d a3£º%d,x3:%d\r\n",a,x,a2,x2,a3,x3);
			//printf("a=%d,n=%d,a2=%d,n2=%d,a3=%d,n3=%d\r\n",a,n,a2,n2,a3,n3);
			if(n < 10 && n2 >= 10 && n3 >= 10){
					printf("Y%c0%1d%c%2d%c%2d\r\n",a,n,a2,n2,a3,n3);
			}	
			else if(n >=10 && n2 < 10 && n3 >= 10){
					printf("Y%c%2d%c0%1d%c%2d\r\n",a,n,a2,n2,a3,n3);
			
			}	
			else if(n >=10 && n2 >= 10 && n3 < 10){
					printf("Y%c%2d%c%2d%c0%1d\r\n",a,n,a2,n2,a3,n3);
			
			}					
			else if(n < 10 && n2 < 10 && n3 >= 10){
					printf("Y%c0%1d%c0%1d%c%2d\r\n",a,n,a2,n2,a3,n3);
			
			}
			else if(n < 10 && n2 < 10 && n3 < 10){
					printf("Y%c0%1d%c0%1d%c0%1d\r\n",a,n,a2,n2,a3,n3);
			
			}
			else if(n >= 10 && n2 < 10 && n3 < 10){
					printf("Y%c%2d%c0%1d%c0%1d\r\n",a,n,a2,n2,a3,n3);
			
			}			
			else if(n >=10 && n2 >= 10 && n3 >= 10){
					printf("Y%c%2d%c%2d%c%2d\r\n",a,n,a2,n2,a3,n3);
			
			}		
				else if(n <10 && n2 >= 10 && n3 < 10){
					printf("Y%c0%1d%c%2d%c0%1d\r\n",a,n,a2,n2,a3,n3);
			
			}		
			//printf();
			//printf("a=%d,sn=%s,a2=%d,sn2=%s,a3=%d,sn3=%s\r\n",a,sn,a2,sn2,a3,sn3);
			sn = NULL;
			sn = bf;
			sn2 = NULL;
			sn = bf2;
			sn3 = NULL;
			sn3 = bf3;
		  //USART1->DR = adcx;
	    while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);

			temp=(float)adcx*(3.3/4096);
			temp2 = (float)adcx2 * (3.3/4096);
			temp3 = (float)adcx3 *(3.3/4096);
      //adcx=temp;
			//printf("V1:%.3f V2:%.3f V3:%.3f\r\n",temp,temp2,temp3);			
	
	
	
}
}
#if 1
int main(void)
 {  u8 i =0;
		int iw = 0;

	 	
		NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
		BLUE_Init();
             //???????    
   Adc_Init(); 
	 //printf("ok"); 
	 //USART1->DR = 0x73;
	 //while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);


#if 0	 
				USART_SendData(USART1,adcx);
				while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
        temp-=adcx;
        temp*=1000;
				USART_SendData(USART1,adcx);
				while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
#endif

	for(i = 0;i < 4;i++){
		
	USART_SendData(USART1,BUF3[i]);
	while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
	
	//BUF2[0] = 0;
	//BUF2[1] = 0;
	}		
       USART_SendData(USART1,BUF3[0]);
			//³õʼ²É¼¯µçλÆ÷µÄADCÖµ
		  adcx=Get_Adc_Average(ADC_Channel_1,10);
		  adcx2 = Get_Adc_Average(ADC_Channel_2,10);
			adcx3 = Get_Adc_Average(ADC_Channel_3,10);
				TIM3_Int_Init(4999,7199); 
	      while(1){


				}
} 
#endif

未完,由于代码较长,我们再开一弹,下一弹 从机械臂代码

【STM32】【C】【嵌入式】分享一下我的项目经验--基于stm32桌面主从机械臂设计(三弹)

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐