找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3626|回复: 2
收起左侧

基于STM32的手写绘图板的设计

[复制链接]
ID:289923 发表于 2018-3-10 10:09 | 显示全部楼层 |阅读模式
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "exti.h"
#include "oled.h"
#include "bmp.h"
#include "stdio.h"
#include "timer.h"
#include "pwm.h"
#include "adc.h"
//#include "dma.h"
#include  "dac.h"
#include "math.h"
//#include "lcd.h"
int key=16,i=4;
/************************************************
Linear model Poly44:
     f(x,y) = p00 + p10*x + p01*y + p20*x^2 + p11*x*y + p02*y^2 + p30*x^3 + p21*x^2*y
                    + p12*x*y^2 + p03*y^3 + p40*x^4 + p31*x^3*y + p22*x^2*y^2
                    + p13*x*y^3 + p04*y^4

Coefficients (with 95% confidence bounds):
       p00 =       815.3  (-611.9, 2243)
       p10 =       -1825  (-4494, 844.2)
       p01 =       214.4  (-1273, 1702)
       p20 =        1371  (237.8, 2505)
       p11 =        -176  (-2239, 1887)
       p02 =      -21.87  (-1250, 1207)
       p30 =      -312.5  (-506.5, -118.6)
       p21 =      -269.4  (-1153, 614.5)
       p12 =       287.3  (-315.6, 890.2)
       p03 =      -82.47  (-401, 236.1)
       p40 =     -0.2298  (-11.15, 10.69)
       p31 =       127.4  (50.16, 204.6)
       p22 =      -116.1  (-333.8, 101.5)
       p13 =       34.01  (-116.9, 184.9)
       p04 =       0.272  (-26.4, 26.94)

************************************************/
u16 key_now;
u8 s[32];
u8 a[20];
u16 k=16;
static float X=0,Y=0,yx=0,yy=0;
int flag;
u16 len;
u16 t;
float j,sum=0;
u16 count;
double  value_bufx[60];
double  value_bufy[60];
double c1,c2,c3,c;

float p1  =            35.9051230284102;
float p2  =            2.51731140785174;
float p3  =            -0.00253321315735517;
float p4  =            1.13774697330653E-6;
float p5  =            -1.90794160143314E-10;
float p6 =             -2.40354264942655;
float p7  =            0.00220119494047271;
float p8 =             -8.97928617687215E-7;
float p9  =            1.37712805906337E-10;

/**************y1******************/
float p1a   =           -31081.3357450581;
float p2a  =            -17.9062208628455;
float p3a   =           0.0043239373019912;
float p4a  =           42.0937583654767;
float p5a   =           -0.00671574580296278;
float p6a   =           -72.3642534788514;
float p7a   =           0.0248376285832583;
float p8a  =            70.2642217404328;
float p9a  =            -0.0232390975855509;
/**************y2********************/
float p1b   =           -419518.550924149;
float p2b   =           -69.145028647627;
float p3b  =            426.237917123716;
float p4b  =            -0.0526281803287531;
float p5b  =            -375.196812392642;
float p6b  =            0.120415417358666;
float p7b  =            381.675580450068;
float p8b  =            -0.122831413051161;

/**************y3********************/


void Initflont(void)
{
           OLED_ShowCHinese(0,0,21);//êÇ·ñμãÏÂ
         OLED_ShowCHinese(16,0,22);//êÇ·ñμãÏÂ
         OLED_ShowCHinese(32,0,28);//êÇ·ñμãÏÂ
         OLED_ShowCHinese(48,0,29);//êÇ·ñμãÏÂ
         OLED_ShowChar(65,0,':');
         OLED_ShowCHinese(70,0,22);//·ñ
         
         OLED_ShowCHinese(0,2,30);//ÏóÏT
         OLED_ShowCHinese(48,2,31);
    OLED_ShowChar(65,2,':');
   OLED_ShowCHinese(70,2,27);//ÎT
         
         OLED_ShowChar(0,4,'X');//XÖá
   OLED_ShowCHinese(16,4,32);//
         OLED_ShowChar(32,4,':');
         
         OLED_ShowChar(0,6,'Y');//YÖá
   OLED_ShowCHinese(16,6,32);//
         OLED_ShowChar(32,6,':');
}
void  Initswith()
{
         GNDB=1;
         GNDD=1;                    
         IB=1;
         ID=1;                  //1  êÇ1Ø     0 êÇ¿a
}
void chooseX()              //  A B =I   C  D=0
{
        GNDB=1;
        IB=0;
        GNDD=0;
        ID=1;
}

void chooseY()          //  A D= I      B  C= 0
{
        GNDB=0;
        IB=1;
        GNDD=1;
        ID=0;        
}


void penwide(float px,float py,u16 wide)
{
OLED_DrawPoint(px,py+wide,1);        
OLED_DrawPoint(px,py,1);
OLED_DrawPoint(px+wide,py,1);
OLED_DrawPoint(px+wide,py+wide,1);        
}


int main(void)
{        
        //u16 led0pwmval=0;
        //u8 dir=1;        
  delay_init(); //Ñóê±oˉêy3õê¼»ˉ         
        uart_init(115200);
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //éèÖÃNVIC·Ö×é á½Î»ÇàÕ¼óÅÏ輶 á½Î»Ïìó|óÅÏ輶   
        LED_Init();                          //3õê¼»ˉóëLEDᬽóμÄó2¼t½ó¿ú
        Ch451_Init();
        Exti_Init();
        OLED_Init();
        Adc_Init();
        Adc_Init2();
        DAC1_Init();
        //lcd_Init();
        TIM3_Int_Init(60,7199);
//        OLED_ShowCHinese(32,2,16);
//  OLED_ShowCHinese(48,2,17);
//        OLED_ShowCHinese(64,2,18);
//        OLED_ShowCHinese(80,2,19);
//        OLED_ShowCHinese(96,2,20);
//        
//        OLED_ShowCHinese(32,4,35);
//        OLED_ShowCHinese(48,4,36);
//        
//        OLED_ShowCHinese(80,4,37);
//        OLED_ShowCHinese(96,4,38);
        
  Initswith();
//        TIM3_PWM_Init(49999,71);
// TIM_SetCompare2(TIM3,25000);
  //chooseY();        
        i=0;
        while(1)
{

// c=y*3.3/4095;
//        
//X=2.07;
//Y=1.854;
//   if(key==14)
//         {
//   chooseX();
//                key=16;
//                 i=4;
//         }                 
//         if(key==15)
//         {
//   chooseY();        
//         key=16;
//                 i=6;
//         }
//         if(key==11)
//         {
//                 Initswith();
//                 key=16;
//         }
//        sprintf((char*)a,"%.3f",yx);
//        OLED_ShowString(40,i,a);

//        sprintf((char*)a,"%.3f",yy);
//        OLED_ShowString(40,i,a);

        //c = p00 + p10*X + p01*Y + p11*X*Y + p02*pow(Y,2)+ p12*X*pow(Y,2) + p03*pow(Y,3);

// c = p00 + p10*X + p01*Y + p20*pow(X,2) + p11*X*Y + p02*pow(Y,2) + p30*pow(X,3)+ p21*pow(X,2)*Y
//                    + p12*X*pow(Y,2) + pow(Y,3) + p40*pow(X,4) + p31*pow(X,3)*Y + p22*pow(X,2)*pow(Y,2)
//                    + p13*X*pow(Y,3)+ p04*pow(Y,4) + p50*pow(X,5) + p41*pow(X,4)*y + p32*pow(X,3)*pow(Y,2);


// j = p00 + p10*X + p01*Y + p20*pow(X,2) + p11*X*Y + p02*pow(Y,2) + p30*pow(X,3)+ p21*pow(X,2)*Y
//    + p12*X*pow(Y,2) + p03*pow(Y,3)+ p40*pow(X,4) + p31*pow(X,3)*Y + p22*pow(X,2)*pow(Y,2)
//                   + p13*X*pow(Y,3) + p04*pow(Y,4);


        if(i<100)
        {        
                chooseX();
                X=yx;
        }
        
        if(i>100&&i<200)
        {
        chooseY();
                Y=yy;
                if(i==199)
                i=0;
        }
        
//x//   z = p1+p2*x+p3*x^2+p4*x^3+p5*x^4+p6*y+p7*y^2+p8*y^3+p9*y^4
//y1         Z = (p1+p2*x+p3*x^2+p4*y+p5*y^2)/(1+p6*x+p7*x^2+p8*y+p9*y^2)
//y2    z = (p1+p2*x+p3*y+p4*y^2)/(1+p5*x+p6*x^2+p7*y+p8*y^2)
//y3         
                 if(i==0)
{
  //j= (p1+p2*X+p3*pow(X,2)+p4*pow(X,3)+p5*Y)/(1+p6*X+p7*pow(X,2)+p8*Y+p9*pow(Y,2)+p10*pow(Y,3));        
j= p1+p2*X+p3*pow(X,2)+p4*pow(X,3)+p5*pow(X,4)+p6*Y+p7*pow(Y,2)+p8*pow(Y,3)+p9*pow(Y,4);
// if(j>0&&j<5)
//         j=j+j/5;
if(j>-7&&j<=0)
        
{
  c1= (p1a+p2a*X+p3a*pow(X,2)+p4a*Y+p5a*pow(Y,2))/(1+p6a*X+p7a*pow(X,2)+p8a*Y+p9a*pow(Y,2));
        if(j>-6&&j<=-3)
        c1-=0.3;
        else
        c1-=1;
        c=c1;
}
        
if(j>0&&j<=6)
        {
  c2= (p1b+p2b*X+p3b*Y+p4b*pow(Y,2))/(1+p5b*X+p6b*pow(X,2)+p7b*Y+p8b*pow(Y,2))-1;
  c=c2;
        }
}


if(key==5)        
{
        Initflont();
        key=16;
}



if(yx>700&&yy<3000)   //ÏÔê¾ êÇ·ñμãÏ               
{
OLED_ShowCHinese(70,0,21);//êÇ
if(j>0)
OLED_ShowCHinese(100,2,34);//right
if(j<0)
OLED_ShowCHinese(100,2,33);//left         

if(j>0&&c>0)
        OLED_ShowCHinese(70,2,23);//one
  if(j<0&&c>0)
        OLED_ShowCHinese(70,2,24);//two
if(j<0&&c<0)
        OLED_ShowCHinese(70,2,25);//three
if(j>0&&c<0)
        OLED_ShowCHinese(70,2,26);//four

         sprintf((char*)a,"%.1f",j);
        OLED_ShowString(40,4,a);
  OLED_ShowString(73,4,"    ");
  sprintf((char*)s,"%.1f",c);
        OLED_ShowString(40,6,s);
   OLED_ShowString(73,6,"   ");
}

else
{
                 OLED_ShowCHinese(70,0,22);//·ñ
                 OLED_ShowCHinese(70,2,27);//ÎT
                 OLED_ShowCHinese(100,2,27);//ÎT
}
        


        if(key==13)
        {
                printf("%.3f\r\n",yx);
                key=16;        
        }
        
  if(key==12)
        {
                printf("%.3f\r\n",yy);
                key=16;                        
        }
}



}

void TIM3_IRQHandler(void)    //¶¨ê±Æ÷ÖD¶Ï
{

if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET)
         //after_kalman_MiddlevalueFilter(Get_Adc(ADC_Channel_1));
        //y=after_kalman_MiddlevalueFilter(Get_Adc(ADC_Channel_1));
        //y=fliter(Get_Adc(ADC_Channel_1));
         //yx=KalmanFilter(Get_Adc(ADC_Channel_1),0.01,50);
  //yy=KalmanFilter(Get_Adc2(ADC_Channel_0),0.5,9);
  //y=GlideFilterAD1(value_bufx,60,Get_Adc(ADC_Channel_1));
        if(i<100)
  yx=GlideFilterAD1(value_bufx,60,Get_Adc(ADC_Channel_1));
  if(i>100&&i<200)
  yy=GlideFilterAD2(value_bufy,60,Get_Adc2(ADC_Channel_0));
  i++;
// yx=yx*3.3/4095;
        //yy=yy*3.3/4095;

        TIM_ClearITPendingBit(TIM3,TIM_IT_Update);

}



void EXTI3_IRQHandler(void)  //¼üÅìÖD¶Ïoˉêy
{  
  key=ch451_read();
        EXTI_ClearITPendingBit(EXTI_Line3);
}


程序.rar

329.9 KB, 下载次数: 19, 下载积分: 黑币 -5

回复

使用道具 举报

ID:212149 发表于 2018-3-14 15:45 | 显示全部楼层
楼主能简单介绍一下这个程序的功能吗
回复

使用道具 举报

ID:165434 发表于 2018-6-13 19:22 来自手机 | 显示全部楼层
有原理图和pcb吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表