【STM32】【C】【嵌入式】分享一下我的项目经验--基于stm32桌面主从机械臂设计(二弹)
本文为原创文章,转载需要注明转载出处前言:嵌入式开发是相比其他IT行业是比较难的行业,它不仅需要你去掌握软件的经验,还要去学习一些硬件的知识,它是软件和硬件的一个粘合剂,起到一个至关重要的地位下面我们接着讲第二弹【STM32】【C】【嵌入式】分享一下我的项目经验--基于stm32桌面主从机械臂设计(一弹)【STM32】【C】【嵌入式】分享一下我的项目经验--基于...
本文为原创文章,转载需要注明转载出处
前言:嵌入式开发是相比其他IT行业是比较难的行业,它不仅需要你去掌握软件的经验,还要去学习一些硬件的知识,
它是软件和硬件的一个粘合剂,起到一个至关重要的地位
下面我们接着讲第二弹
【STM32】【C】【嵌入式】分享一下我的项目经验--基于stm32桌面主从机械臂设计(一弹)
【STM32】【C】【嵌入式】分享一下我的项目经验--基于stm32桌面主从机械臂设计(二弹)
【STM32】【C】【嵌入式】分享一下我的项目经验--基于stm32桌面主从机械臂设计(三弹)
目录
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
未完,由于代码较长,我们再开一弹,下一弹 从机械臂代码
更多推荐
所有评论(0)