MSP430之自动增益程控放大main备份
占位符
1 #include <msp430.h> 2 #include "sys.h" 3 #include "ps2.h" 4 #include "12864.h" 5 #include "adc.h" 6 #include "tlv5638.h" 7 #include "pid.h" 8 #include "timera.h" 9 #include "uart.h" 10 #include "vosc.h" 11 12 //#define _DISMAIN_ 13 14 #define ADCN 10 // ad采集次数 15 16 // 在ps2.c里面定义 17 extern unsigned char ps2_keyvalue; 18 extern unsigned char ps2_flag; 19 20 unsigned int m = 1300; // TLV5638设置值 21 unsigned char adcnt = 0; 22 unsigned int adcFinish = 0; 23 unsigned int adcValue = 0, advArr[ADCN] = { 0 }; // ADC采集的值,采集13次保存在数组里 24 unsigned int ta_flag = 0, dispFlag = 0; 25 26 // pid参数 27 unsigned int point = 1200; // 目标值 28 float p = 0.1, i = 0, d = 0.1; 29 int inc = 0, tempInc; // 增量 30 unsigned int out2Osc[10] = { 0 }; 31 32 // 获取键盘输入 33 void GetInput() 34 { 35 unsigned char temp; 36 temp = PS2_AsiiConvert(ps2_keyvalue); 37 38 if(temp == '+') 39 { 40 point += 100; 41 if(point >= 2000) 42 point = 2000; 43 IncPIDSetPoint(point); // 44 LCD_Set_Pos(0, 4); 45 LCD_Show_Num(point); 46 } 47 else if(temp == '-') 48 { 49 point -= 100; 50 if(point < 11) 51 point = 10; 52 IncPIDSetPoint(point); 53 LCD_Set_Pos(0, 4); 54 LCD_Show_Num(point); 55 } 56 else if(temp == '7') //p设置 57 { 58 p += 0.01; 59 IncPIDSet(p, i, d); 60 LCD_Set_Pos(3, 0); 61 LCD_Show_Deci2(p); 62 } 63 else if(temp == '1') 64 { 65 p -= 0.01; 66 IncPIDSet(p, i, d); 67 LCD_Set_Pos(3, 0); 68 LCD_Show_Deci2(p); 69 } 70 else if(temp == '8') 71 { 72 i += 0.01; 73 IncPIDSet(p, i, d); 74 LCD_Set_Pos(3, 3); 75 LCD_Show_Deci2(i); 76 } 77 else if(temp == '2') 78 { 79 i -= 0.01; 80 IncPIDSet(p, i, d); 81 LCD_Set_Pos(3, 3); 82 LCD_Show_Deci2(i); 83 } 84 else if(temp == '9') 85 { 86 d += 0.01; 87 IncPIDSet(p, i, d); 88 LCD_Set_Pos(3, 6); 89 LCD_Show_Deci2(d); 90 } 91 else if(temp == '3') 92 { 93 d -= 0.01; 94 IncPIDSet(p, i, d); 95 LCD_Set_Pos(3, 6); 96 LCD_Show_Deci2(d); 97 } 98 else 99 { 100 } 101 P2IFG &= ~BIT4; 102 } 103 104 /* 105 * 加权滤波 106 */ 107 unsigned int filter(unsigned int arr[]) 108 { 109 unsigned char i; 110 111 /* 均值滤波 */ 112 unsigned int temp = 0; 113 114 for (i = 0; i < ADCN; i++) 115 { 116 temp += arr[i]; 117 } 118 temp = (unsigned int) (temp * 1.0 / ADCN); 119 120 return temp; 121 } 122 123 /* 124 * AGC自动调节 125 */ 126 void AGC() 127 { 128 // 测试用 129 // P1OUT |= BIT6; 130 131 adcValue = (unsigned long) (filter(advArr) * 2500.0f / 1024.0f);// * 1000.0f ); // / 1024.0f); 132 // 计算增量 133 inc = IncPIDCalc(adcValue); 134 tempInc += inc; // 增量调节 135 if(tempInc < 0) 136 tempInc = 0; // 输出限制>=0V 137 if(tempInc > 2000) 138 tempInc = 2000; // 输出限制<=2V 139 m = (unsigned int) tempInc; 140 141 // 设置TLV值 142 TLV_WriteData(0xd002); // 写入通道A 143 TLV_WriteData(Volt(m)); 144 145 // 输出到虚拟示波器 146 out2Osc[0] = point; 147 out2Osc[1] = (unsigned int) adcValue; 148 out2Osc[2] = m; 149 out2Osc[3] = 0; 150 VOSC_Out4Data(out2Osc); 151 152 // P1OUT &= ~BIT6; 153 } 154 155 #ifndef _DISMAIN_ 156 void main() 157 { 158 // 测试用 159 P1DIR |= BIT6; 160 P1OUT |= BIT6; 161 // P2DIR |= BIT5; 162 // P2OUT |= BIT5; 163 164 System_Init(); 165 LCD_Init(); 166 PS2_Init(); 167 TLV_Init(); // TLV5638控制电压 168 ADC_Init2(); // P1.310次采集 169 __delay_cycles(10000); 170 TA_Init(); // 定时器初始化,10ms 171 Uart_Init(); // OSC用到串口 172 173 // PID初始化 174 IncPIDInit(p, i, d, point); 175 176 // UI 177 LCD_Clear(); 178 LCD_Set_Pos(0, 0); 179 LCD_Show_String("PointV->"); // 目标值 180 LCD_Set_Pos(0, 4); 181 LCD_Show_Num(point); 182 LCD_Set_Pos(0, 7); 183 LCD_Show_String("mV"); 184 LCD_Set_Pos(1, 0); 185 LCD_Show_String("CurSet->"); // 当前设定值 186 LCD_Set_Pos(1, 4); 187 LCD_Show_Num(m); 188 LCD_Set_Pos(1, 7); 189 LCD_Show_String("mV"); 190 LCD_Set_Pos(2, 0); 191 LCD_Show_String("ADCapV->"); // 采集电压 192 LCD_Set_Pos(2, 4); 193 LCD_Show_Num(adcValue); 194 LCD_Set_Pos(2, 7); 195 LCD_Show_String("mV"); 196 197 // 显示pid参数 198 LCD_Set_Pos(3, 0); 199 LCD_Show_Deci2(p); 200 LCD_Set_Pos(3, 3); 201 LCD_Show_Deci2(i); 202 LCD_Set_Pos(3, 6); 203 LCD_Show_Deci2(d); 204 205 // 写入初始电压 206 TLV_WriteData(0xd002); 207 TLV_WriteData(Volt(m)); 208 LCD_Set_Pos(1, 4); 209 LCD_Show_Num(m); 210 211 // agc初始化 212 tempInc = m; 213 214 _EINT(); // 使能中断,键盘、定时器 215 while (1) 216 { 217 // 键盘 218 if(ps2_flag == 1) 219 { 220 GetInput(); // 获取按键,处理按键事件 221 ps2_flag = 0; 222 } 223 224 // ADC采集 225 // if(ta_flag == 1) 226 // { 227 // ta_flag = 0; 228 // 229 // // AD采集 230 // ADC_Start2(advArr); 231 // } 232 233 // AGC调节 234 // if(adcFinish == 1) // 采集了N次 235 // { 236 // adcFinish = 0; 237 // AGC(); 238 // } 239 240 // // 设置TLV值 241 // TLV_WriteData(0xd002); // 写入通道A 242 // TLV_WriteData(Volt(m)); 243 244 // 显示延时 245 if (dispFlag >= 150) 246 { 247 dispFlag = 0; 248 249 // 显示当前设定值 250 LCD_Set_Pos(1, 4); 251 LCD_Show_Num(m); 252 253 // 显示AD采集结果 254 LCD_Set_Pos(2, 4); 255 LCD_Show_Num(adcValue); 256 } 257 } 258 } 259 260 #pragma vector=TIMER0_A0_VECTOR 261 __interrupt void TIME0_A0_ISR(void) 262 { 263 ta_flag = 1; // 定时时间到 264 dispFlag++; // 用于显示延时 265 266 // P2OUT |= BIT5; // 准备AGC 267 ADC_Start2(advArr); // AD采集 268 269 // _EINT(); 270 271 // 测试用 272 P1OUT ^= BIT6; 273 } 274 275 #pragma vector = ADC10_VECTOR 276 __interrupt void ADC10ISR(void) 277 { 278 // adcFinish = 1; 279 280 ADC10CTL0 &= ~(ENC + ADC10SC); // 停止转换 281 AGC(); // 采集完成,AGC调节 282 // P2OUT &= ~BIT5; 283 284 // adcFinish = 0; 285 } 286 287 #endif
转载于:https://www.cnblogs.com/rongfangliu/p/ampMain.html
MSP430之自动增益程控放大main备份相关推荐
- msp430 abs函数 c语言,实现一个简单的msp430软件
以做一个简单的采集设备为例.假定已经准备好硬件设备,现在我们开始在MCU上搭建运行的软件. 使用的软件为iar ew430 5.10b,仿真器是杭州利尔达的USB型MSP430仿真器LSD-FET43 ...
- 基于LTC1068的程控滤波器
一 项目功能介绍 该装置包括放大器增益可调和滤波器工作模式及工作频率可调.此装置可广泛应用于信号处理.仪器仪表和工业控制等方面.以下为详细功能介绍: (1)放大器输入正弦信号电压峰峰值为20mV,电压 ...
- 基于STM32单片机和Android的便携式数字示波器设计
目 录 1 绪论 1 1.1 示波器概述 1 1.2 数字示波器的特点及原理 1 1.3 数字示波器国内外研究状况 2 1.4 Android概述 3 1.5 题目研究背景及意义 4 2 数字示波器原 ...
- 基于DAC0832的程控衰减器
基于DAC0832的程控衰减器 文章目录 基于DAC0832的程控衰减器 一.需求分析: 二.主要元器件: 三.设计流程 四.工作原理 4.1完整原理图 4.2仿真环境 4.3基准源 2.56V 4. ...
- 频率响应函数与数字滤波实验_WKD3419振动测试与控制教学实验系统
一.概述: WKD3419型振动测试与控制系统是一套集成化的振动测试系统,通过参考实验指导书可以做近几十个振动方面的实验,包括振动基本参数频率.振幅的测试:基本物理量位移.速度.加速度的测试:单自由度 ...
- 关于21年电赛,这些一定要熟悉!
▼点击下方名片,关注公众号▼ 知识点概要 仪器仪表:小信号放大.滤波器.程控放大.频率相位测量.锁相频率合成.峰值检波测量.功率放大.A/D,D/A,FFT等. 通信高频:振荡.混频.调制解调(AM. ...
- Chrome运行时性能瓶颈分析
一,初探,根据现象发现问题 chrome的performance知道很久了,但总是没有特别权威且跟上时代的学习资料,这次痛定思痛,直接看英文文档,一点点把这块啃掉,本笔记基于Chrome 59 ste ...
- 高性能 MySQL实战
概览 内容来自于周彦伟的<高性能MySQL实战>,课程有 10 个课时,本人对其内容进行了梳理.消化并形成笔记. 1. 高性能 MySQL 基础篇 1.1 体系结构 Client Conn ...
- 计算机测试ppt,计算机测试重点.ppt
机械工程测试技术-- 计算机测试技术(5);内容 ;重点 ;1.概述 ;1.概述 ;组成硬件 信号调理:隔离.放大.滤波数据采集:采集板/卡/器 模拟开关.采样保持.AD转换计算机:PC.IPC.CP ...
- 电赛中常用的模块电路设计
关注v-x-公-众-号:[嵌入式基地] 后-台-回-复:[电赛] 即可获资料 回复[编程]即可获取 包括有:C.C++.C#.JAVA.Python.JavaScript.PHP.数据库.微信小程序. ...
最新文章
- 集成显卡+独立显卡实现三屏显示
- 【数据平台】python语言NLP库Gensim初识
- C宏定义中的##,#,#@用法介绍
- oracle数据库存储过程中NO_DATA_FOUND不起作用解决
- iOS底层探索(二) - 写给小白看的Clang编译过程原理
- 【CSS3动画】transform对文字及图片的旋转、缩放、倾斜和移动
- Linux创建文件【命令】
- 2017华南理工华为杯H bx值(容斥问题)
- JAVA_HOME is not defined Ubuntu中设置JAVA_HOME路径
- 普歌-码上鸿鹄团队:在Nuxt(vue)渲染模板中使用mock.js随机生成数据
- Mapping Spiking Neural Networks的论文汇总以及思考
- 局域网内共享打印机的几种方式
- Vue+ .netcore3.1 模拟QQ邮箱发送验证码
- Oracle计算时间差
- 区块链数据服务 - BDS
- 服务器系统的监测,服务器监测系统
- 21个免费的UI界面设计工具、资源及网站
- 配置vsftpd 服务器
- 福利视频:一大波妹子助阵TFC,快来猜猜猜!
- 【水滴石穿】mobx-todos
热门文章
- The Stanford Geostatistical Modeling Software(地质统计软件)
- 对分类型变量,进行编码处理——pd.get_dummies()、LabelEncoder()、oneHotEncoder()
- iframe 实现网页本页显示
- 使用 IntelliJ IDEA打包Spark应用程序
- Python3-笔记-E-012-库-JSON
- kotlin-2(IdeaIU-2018.2汉化破解)
- Spring整合JMS——三种connectionFactory
- SQL反模式学习笔记15 分组
- 更多编译器对C++11的支持比较
- MSP430学习笔记10-ADC采集1602显示