1nnocet-

  • 2019-09-15
  • 加入了学习《高能效 AC-DC 开关电源控制器和应用简介》,观看 TI 的 AC-DC 产品历史悠久

  • 2019-08-05
  • 加入了学习《如何进行开关电源拓扑选择》,观看 1.1 开关电源拓扑介绍

  • 2019-07-24
  • 回复了主题帖: 【ufun学习】实战篇1:《PWM控制直流电机加减速正反转》

    视频中电机跳动是因为电机反转时产生的

  • 2019-07-23
  • 发表了主题帖: 【ufun学习】实战篇1:《PWM控制直流电机加减速正反转》

    本帖最后由 1nnocet- 于 2019-7-23 14:50 编辑 《PWM控制直流电机加减速正反转》 由于近期比较忙这里做简单介绍:该篇使用TIM3的通道3和通道4来输出两路PWM。可以通过触摸按键控制占空比。 下面为系统的主要框图: 整个系统由以上几部分组成,以ufun为主控模块,控制电机驱动电路;通过触摸键盘设置输出PWM波的占空比,控制电机转动的快慢;设置两个GPIO口决定是否输出PWM波;控制电机转动的方向。     接下来简单介绍下程序:定时器和按键初始化这里不再赘述,前面的学习篇有讲解。程序要注意的地方是不能让两个通道同时输出PWM,一路控制正转,另一路控制反转。文末有部分代码,如果想练手又实在写不出来的,需要源文件可以私信分享   运行效果: 1.示波器测量占空比:占空比在1%-100%可调   2.电机驱动效果 3.另外方便测试还做了接口的拓展板,电机驱动模块是以前在淘宝买的,驱动模块是H桥电机驱动拓扑                                接口拓展板主要拓展地的接口                                电机驱动板 此内容由EEWORLD论坛网友1nnocet-原创,如需转载或用于商业用途需征得作者同意并注明出处 #include "stm32f10x.h" #include "stdio.h" #include "main.h" #include "LED.h" #include "PWM.h" #include "DELAY.h" #include "TOUCH_KEY.h" #include "stdlib.h" #define Arr 500 #define Psc 5 extern int channel; int main() { int key_value,Duty_num=Arr/2; //占空比默认50% int mode=0; PwmGPIO_Init(); TIM3_PWM2_Init(Arr,Psc); //pwm初始化 TIM3_PWM1_Init(Arr,Psc); TK_GPIO_Init(); //触摸按键初始化 //初始化捕获比较值输出PWM TIM_SetCompare2(TIM3,Duty_num); TIM_SetCompare1(TIM3,Duty_num); while (1) { key_value=Key_Scan(mode); //获取键值 if(key_value==1) //检测到touch0被按下 进行加速操作 { if(channel==1) //判断通道 { Duty_num+=Psc; if(Duty_num>=Arr) { Duty_num=Psc; } TIM_SetCompare1(TIM3,Duty_num); //通过改变占空比改变速度 } if(channel==2) { Duty_num+=Psc; if(Duty_num>=Arr) { Duty_num=Psc; } TIM_SetCompare2(TIM3,Duty_num); //通过改变占空比改变速度 } } if(key_value==2) //检测到touch1被按下 进行减速操作 { if(channel==1) { Duty_num-=Psc; if(Duty_num<=Psc) { Duty_num=Arr; } TIM_SetCompare1(TIM3,Duty_num); //通过改变占空比改变速度 } if(channel==2) { Duty_num-=Psc; //亮度上升 if(Duty_num<=Psc) { Duty_num=Arr; } TIM_SetCompare2(TIM3,Duty_num); //通过改变占空比改变速度 } } if(key_value==4) //检测到touch3被按下 切换通道(正反转切换) { if(channel==1) { TIM3_PWM2_Init(Arr,Psc); TIM_SetCompare2(TIM3,Duty_num); } else if(channel==2) { TIM3_PWM1_Init(Arr,Psc); TIM_SetCompare1(TIM3,Duty_num); } } if(key_value==3) //检测到touch2被按下 { if(mode==0) //按键模式切换,mode=0为关闭连续按键,mode=1位开启连续按键 { mode=1; while(TOUCH2); } else mode=0; } } } void TIM3_PWM1_Init(u16 arr,u16 psc) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定时器2时钟 //初始化TIM TIM_TimeBaseStructure.TIM_Period = arr-1; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 TIM_TimeBaseStructure.TIM_Prescaler =psc-1; //设置用来作为TIMx时钟频率除数的预分频值 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);//根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位 //初始化TIM Channe PWM模式 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高 // TIM_OC1Init(TIM3, &TIM_OCInitStructure); //初始化外设TIM2 OC1 // TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIM2在CCR1上的预装载寄存器 // // TIM_OC2Init(TIM3, &TIM_OCInitStructure); //初始化外设TIM2 OC2 // TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIM2在CCR2上的预装载寄存器 TIM_OC3Init(TIM3, &TIM_OCInitStructure); //初始化外设TIM2 OC3 TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIM2在CCR3上的预装载寄存器 //初始化TIM Channe PWM模式 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable; //比较输出使能 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高 TIM_OC4Init(TIM3, &TIM_OCInitStructure); //初始化外设TIM2 OC4 TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIM2在CCR3上的预装载寄存器 TIM_Cmd(TIM3, ENABLE); //使能TIM2 TIM_ARRPreloadConfig(TIM3, ENABLE);//使能或者失能 TIM2 在 ARR 上的预装载寄存器 TIM_CtrlPWMOutputs(TIM3, ENABLE);// channel=1; }  

  • 回复了主题帖: 【ufun学习】学习篇5:《基础例程4 - USB串口与PC通讯》

    desk1983 发表于 2019-7-23 08:28 能不能把Serial Port Utility(串口调试助手)共享一下一? 方便大家在学习的时候 观察板子与PC通讯 ...
    串口调试助手下载地址,

  • 回复了主题帖: 【ufun学习】学习篇5:《基础例程4 - USB串口与PC通讯》

    1nnocet- 发表于 2019-7-23 09:27 我找找
    我是在百度上面找的,下载链接不知道能不能找到,我把安装包上传到帖子了,但是要重新审核

  • 回复了主题帖: 【ufun学习】学习篇5:《基础例程4 - USB串口与PC通讯》

    我找找

  • 2019-07-22
  • 发表了主题帖: 【ufun学习】学习篇6:《基础例程5 - 触摸按键控制-PWM》

    本帖最后由 1nnocet- 于 2019-7-22 16:39 编辑 此内容由EEWORLD论坛网友1nnocet-原创,如需转载或用于商业用途需征得作者同意并注明出处 《基础例程5 - 触摸按键控制-PWM》 此例程与《基础例程2 - PWM控制》例程比较相似,相同之处是都使用定时器TIM2产生PWM控制RGB灯,区别是该例程加入了触摸按键可以控制输出PWM的占空比从而调整灯的亮度,而例程二是使用随机函数产生的值来生成控制占空比的数值,控制灯的亮度。 下面简单介绍一下该例程的学习动态。 1.首先依旧是外设的初始化,该例程所用到的外设资源大体上相似,相同的部分可以参见学习篇3。这里只介绍触摸按键的初始化,因为这个是与例程二的不同之处。 由原理图可以得知四个按键对应的芯片引脚为PB3、PB4、PC4和PC5四个引脚,所以初始化需要对这四个引脚进行初始化,值得注意的是还需改变指定管脚映射,JTAG-DP 失能 + SW-DP 使能。 void TK_GPIO_Init() { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO,ENABLE);//使能GPIOB、GPIOC及功能复用IO时钟 GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); //改变指定管脚映射,JTAG-DP 失能 + SW-DP 使能。目的是使PB3的I/O口功能处于可用状态 //引脚定义 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TOUCH0 // 浮空输入 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //初始化 GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; //TOUCH1 GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //TOUCH2 GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; //TOUCH3 GPIO_Init(GPIOB, &GPIO_InitStructure); } 2.下面具体看下main函数,三个led1_brightness变量按照其英文意思大概也能猜到是控制灯亮度的变量。TIM2_PWM_Init(399,0);    初始化定时器TIM2的周期值为399+1,预分频值为0+1,三个TIM_SetCompare1(TIM2,led1_brightness);函数捕获比较值初始化三种灯的初始亮度。while(1)里面由Key_Scan(mode);函数捕获键值,并对相应的led1_brightness操作改变预分频的值进而改变灯的亮度。由led2_brightness=led2_brightness-50;    由“led2_brightness=led2_brightness-50;    ”可以看出灯的亮度分为400/50=8档亮度可调。键值1,2,4对应调整三个灯的亮度,键值3可以改变按键模式(点击一次改变一次亮度和长按可连续调整亮度两种模式)。 int main() { int key_value,led1_brightness=400,led2_brightness=400,led3_brightness=400; //键值 int mode=0; //按键模式 LED_Init(); //led初始化 TIM2_PWM_Init(399,0); //pwm初始化 TK_GPIO_Init(); //触摸按键初始化 //led亮度初始化 TIM_SetCompare1(TIM2,led1_brightness); TIM_SetCompare2(TIM2,led2_brightness); TIM_SetCompare3(TIM2,led3_brightness); while (1) { key_value=Key_Scan(mode); //获取键值 if(key_value==1) //检测到touch0被按下 { led1_brightness=led1_brightness-50; //亮度上升 if(led1_brightness==0) { led1_brightness=400; } TIM_SetCompare1(TIM2,led1_brightness); //通过改变占空比改变三色led的亮度 } if(key_value==2) //检测到touch1被按下 { led2_brightness=led2_brightness-50; //亮度上升 if(led2_brightness==0) { led2_brightness=400; } TIM_SetCompare2(TIM2,led2_brightness); } if(key_value==4) //检测到touch3被按下 { led3_brightness=led3_brightness-50; //亮度上升 if(led3_brightness==0) { led3_brightness=400; } TIM_SetCompare3(TIM2,led3_brightness); } if(key_value==3) //检测到touch2被按下 { if(mode==0) //按键模式切换,mode=0为关闭连续按键,mode=1位开启连续按键 { mode=1; while(TOUCH2); //如果按键未抬起,阻塞,直到抬起,防止模式跳变 } else mode=0; } } } 3.例程运行效果:可以通过三个按键分别改变三个灯的亮度,一共可以调节八个档位。另一个按键可以改变按键模式。另外还将步进改成了10 即led2_brightness=led2_brightness-10;这样灯的亮度就可以有40档的调节档位,经过验证其可行的。 4.后期还会出一个使用按键控制PWM的实战作品,大家可以猜猜具体内容是用于何种作用

  • 发表了主题帖: 【ufun学习】学习篇5:《基础例程4 - USB串口与PC通讯》

    本帖最后由 1nnocet- 于 2019-7-23 09:30 编辑 《基础例程4 - USB串口与PC通讯》 USB串口与PC通讯需要使用到CH340T的TXD和RXD引脚,分别对应着学习板STM32F103RC芯片的PA9和PA10引脚。 另外查看例程运行效果时还需安装Serial Port Utility(串口调试助手)观察板子与PC通讯效果。 以下为该例程的学习过程: 串口的初始化:串口的初始化除了对使用到的GPIO初始化以外还需对USART1时钟使能、TX、RX配置、波特率、数据位、停止位、奇偶模式、硬件流控模式和发送接收模式的设置。在串口助手调试时需要按照串口初始化的内容进行设置。 ") rgba(220, 220, 220, 0.5); top: -15px; left: 0px; display: block;"> 之后还需要进行NVIC中断的初始化,该初始化需要选择中断向量控制寄存器组、设置中断优先级等操作,例程中有比较详细的说明。 ") rgba(220, 220, 220, 0.5); top: -15px; left: 0px; display: block;"> 其中main函数中的    extern uint8_t ucTemp;    变量有点难搞,找了半天原来是在stm32f10x_it.h文件里面,用于void USART1_IRQHandler()         串口接收中断函数中 例程调试: a.打开串口调试助手选择对应串口进行如下设置: 波特率设置:9600 数据位设置:8 停止位设置:1 奇偶模式设置:N 硬件流控模式设置:N 接收:ASCII 发送:HEXb.串口调试助手发送0x10给ufun,ufun开始发送数据给串口调试助手; 串口调试助手发送0x11给ufun,ufun停止发送数据给串口调试助手; 此内容由EEWORLD论坛网友1nnocet-原创,如需转载或用于商业用途需征得作者同意并注明出处  

  • 2019-07-21
  • 发表了主题帖: 【ufun学习】学习篇4:《基础例程3 - 蜂鸣器控制》

    本帖最后由 1nnocet- 于 2019-7-22 10:23 编辑 此内容由EEWORLD论坛网友1nnocet-原创,如需转载或用于商业用途需征得作者同意并注明出处 《基础例程3 - 蜂鸣器控制》 有学过单片机的相信一定对蜂鸣器有较深的印象,蜂鸣器分为有源蜂鸣器和无源蜂鸣器,这两种蜂鸣器有什么 本质区别呢?其中有源蜂鸣器内部有振荡器,只要外部给电源便能发声;无源蜂鸣器内部没有振荡器,所以提供电源不足以使其发声。下面我们就来验证一下学习板上的蜂鸣器是有源还是无源的蜂鸣器。 我们验证使用的是《基础例程3 - 蜂鸣器控制》改编的代码,除了while(1)里面的代码内容,其余都是跟例程一样的。 首先我们先给对应的GPIO高电平(即PA8), 烧写程序后运行,蜂鸣器没有发声,因此可以大致断定该蜂鸣器为无源蜂鸣器。 #include "stm32f10x.h" #include "stdio.h" #include "main.h" #include "stdlib.h" #include "BEEP.h" #include "TOUCH_KEY.h" #include "DELAY.h" int main() { int i; int Sheet_music[]={6,7,8,8,7,8,8,10,10,7,7,0,0,3,3,6,6,6,5,6,6,8,8,5,5,5};//乐谱 int Sheet_length=sizeof(Sheet_music) / sizeof(Sheet_music[0]); //乐谱数组长度计算 BEEP_Init(); //蜂鸣器配置 while (1) { GPIO_SetBits(GPIOA,GPIO_Pin_8); //此注释部分测试蜂鸣器是否为有源蜂鸣器 //GPIO_SetBits(GPIOA,GPIO_Pin_8); 这四行注释掉的代码是验证蜂鸣器是否为无源蜂鸣器的代码 //Delay_Ms(1); //GPIO_ResetBits(GPIOA,GPIO_Pin_8); //Delay_Ms(1); } } 为了进一步确定蜂鸣器的种类我们再次进行试验,这次我们给一个时间间隔为1ms的高电平时钟(代码while(1)里面注释掉的部)。 烧写代码后验证,以下视频为延时1ms程序运行情况。 蜂鸣器发出响声,断定该蜂鸣器为无源蜂鸣器。   下面简单介绍下例程,main函数代码依旧是先对使用到的外设进行初始化(该部分与前面的学习篇基本一致,不再赘述),这个例程的难点在于乐谱的产生,这个乐谱应该使用软件生成的,之前也有使用过,但对本人来说用处不是很大就没有去深究,感兴趣的可以在百度找找,相信都难不倒大家的。 下面是例程运行的情况,循环播放乐谱 case 1: //do scale(doo); break; case 2: //re scale(re); break; case 3: //mi scale(mi); break; case 4: //fa scale(fa); break; case 5: //sol scale(sol); break; case 6: //la scale(la); break; case 7: //si scale(si); break; case 8: //高音do scale(DO); break; case 9: //高音re scale(RE); break; case 10: //高音mi scale(MI); break; scale()函数里面的元素是宏定义来的,在main.h文件里面。 验证蜂鸣器中用到的函数GPIO_SetBits(GPIOA,GPIO_Pin_8);是在GPIO.h文件中找到的,里面还有很多对GPIO操作的函数。    

  • 2019-07-20
  • 发表了主题帖: 【ufun学习】学习篇3:《基础例程2 - PWM控制》

    本帖最后由 1nnocet- 于 2019-7-21 08:54 编辑 《基础例程2 - PWM控制》 脉宽调制(Pulse Width Modulation)是一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。此例程使用PWM控制RGB三色灯的亮度。下面我们详细看下例程的具体详情: 例程说明:红、绿、蓝以随机的亮度比例组合成不同颜色的光 实验操作/使用:烧录程序,上电,复位. 1.该例程使用到的外设有:RGB灯,和定时器TIM2的通道一、通道二和通道三。RGB灯在原理图中对应芯片的PA0、PA1和PA2引脚,同时三个定时器的三个通道也对应着这三个引脚。 2.下图为main函数,函数的开始部分依然是对外设的初始化,LED_Init()与学习篇1中的基本相同这里不再赘述, TIM2_PWM_Init(399,0)中主要是对定时器赋周期值和预分频的值,其余的就可以套用例程的公式了,个人认为先学会使用,在实战的基础之上再慢慢深究其中的代码。需要注意的一点是要用到的定时器通道需要初始化外设相应的OCx代码与下图22、23、25、26、28、29行类似。 Main函数功能代码部分主要是使用了srand(2)函数生成随机数,用作后期定时器预分频的值,while(1)循环中三个TIM_SetComparex(TIM2,rand()%500);函数将产生的随机数作为预分频值赋值给三个定时器的三个不同通道,同时控制RGB灯。 3.例程运行情况:   RGB灯随机地以不同的亮度闪烁,形成不同的颜色。 文中如果有讲述得不对的地方望指出,本人必将虚心接受,共同学习。或者有什么好的想法也可以评论分享,欢迎大家共同学习进步。    

  • 点评了资料: Proteus教程中文版,值得你学习

  • 发表了主题帖: 【ufun学习】学习篇2:《基础例程1 - 三色LED控制》

    《基础例程1 - 三色LED控制》 先介绍一下32的代码主要结构:一个功能完整的工程由一个main.c文件和若干个***.c文件组成,其中每个***.c文件对应着***.h文件,***.c文件主要是将各种外设实现的功能封装在一个***.c文件中,main函数通过调用多个***.c文件实现一个比较完善的功能。代码结构层次清晰。下面为《基础例程1 - 三色LED控制》的具体详情: 1.Main函数中要对外设进行初始化,以及功能程序代码编写,该例程main函数如下图: 外设初始化(LED初始化) 该例程主要是对GPIO的控制,要实现 GPIO 的控制,需要多GPIO进行初始化。 初始化步骤分为:a.使能端口时钟——》b.引脚定义——》c.设置引脚输出类型——》d.初始化GPIO b.由ufun板的原理图中可以得知RGB灯对应的GPIO分别为PA0、PA1和PA2,所以引脚定义时要对Pin0~2进行定义。 c.设置GPIO输入输出类型一共分为8类:输入模式     -输入浮空(GPIO_Mode_IN_FLOATING)     -输入上拉(GPIO_Mode_IPU)     -输入下拉(GPIO_Mode_IPD)     -模拟输入(GPIO_Mode_AIN) 输出模式     -开漏输出(GPIO_Mode_Out_OD)     -开漏复用功能(GPIO_Mode_AF_OD)     -推挽式输出(GPIO_Mode_Out_PP)     -推挽式复用功能(GPIO_Mode_AF_PP) 该例程用于控制RGB灯,设置为推挽输出模式。 d.初始化GPIO 下图为该例程LED初始化部分: 了SysTick也叫时钟滴答,其实质就是一个递减的定时器。在历程中用于毫秒级的延时。 3.例程演示效果:绿、蓝、红灯一次点亮,间隔为1秒钟。 电源指示灯和RGB灯亮度有点高就用纸片贴住了,这样拍摄效果会好点 文中如果有讲述得不对的地方望指出,本人必将虚心接受,共同学习。或者有什么好的想法也可以评论分享,欢迎大家共同学习进步。 此内容由EEWORLD论坛网友1nnocet-原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 2019-07-17
  • 发表了主题帖: 【ufun学习】学习篇1:ufun学习板功能测试

    本帖最后由 1nnocet- 于 2019-7-20 08:59 编辑 板子一收到就拆开看了,里面有一块学习板和两个2.0的跳线帽,跳线帽掉了一个不过还好找回来了。板子比想象中的迷你很多,但是“麻雀虽小,五脏俱全”特地对着入门指南的图片观察了蜂鸣器(原来还有这么迷你的蜂鸣器)、RGB灯、超级电容、触摸按键(按键很精美,科技感非常足)等等。最主要的是板子上还预留了40PIN的2.0排插,可以根据自己的需要外接需要控制的器件,板子布局合理,其中最满意的还是预留了很多的测试点,这样使用时就很方便测试啦。板 此内容由EEWORLD论坛网友1nnocet-原创,如需转载或用于商业用途需征得作者同意并注明出处 子供电可以直接使用手机充电线供电,在外面带个充电宝和数据线即可,携带方便灵活。                                                       正面                                                                  板子的背面测试点随处可见         大概看了下开发指南后就迫不及待的照着教程安装起了驱动软件,刚开始遇到点问题,但是按着开发指南操作很快就解决了问题。之后就烧了个例程测试开发板,下面是《ufun功能测试例程》的大致功能:         这个例程大概涉及到了触摸按键、RGB灯、蜂鸣器、SD卡、串口、ADC、LIS3DH等等;         1.程序运行蜂鸣器就会先响1~2秒的样子;         2.大概看了下代码该例程使用到了SysTick也叫时钟滴答,其实质就是一个定时器。在历程中用于毫秒级的延;。         3.其中电容触摸按键可以控制RGB灯;         4.SD卡的拔插状态发生改变的同时蜂鸣器会响一声;         5.通过观察该例程代码可以发现这个例程应该还有使用到液晶屏,不知道使用的是哪种的液晶屏,代码的液晶屏部分做了良好的操作提示。         总得来说这是一块很好的学习板,非常值得大家学习使用。                 例程运行效果:                 由于拍照和灯光问题RGB灯的颜色看不太清楚。    

  • 2019-07-08
  • 回复了主题帖: UFUN学习板测评入选名单公布

    1

最近访客

< 1/1 >

统计信息

已有8人来访过

  • 芯币:43
  • 好友:--
  • 主题:7
  • 回复:5
  • 课时:--
  • 资源:--

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言