当前位置: 首页 > news >正文

电子商务网站推广计划手机网站开发设计包括什么

电子商务网站推广计划,手机网站开发设计包括什么,网站设计 线框图,wordpress标题翻译1 ADC简介 ADC#xff08;Analog-Digital Converter#xff09;模拟-数字转换器 ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量#xff0c;建立模拟电路到数字电路的桥梁 STM32是数字电路#xff0c;只有高低电平#xff0c;没有几V电压的概念#xff…1 ADC简介 ADCAnalog-Digital Converter模拟-数字转换器 ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量建立模拟电路到数字电路的桥梁 STM32是数字电路只有高低电平没有几V电压的概念想读取电压值就需要借助ADC模数转换器了。DAC则是相反的功能。 12位逐次逼近型ADC1us转换时间 分辨率一般用多少位来表示0 ~ 2 ^ 12 - 1量化结果0~4095 转换时间也是转换频率从转换开始到产生结果需要花1us时间即转换频率是1MHz 输入电压范围0~3.3V转换结果范围0~4095 线性对应 18个输入通道可测量16个外部和2个内部信号源 16个GPIO口、内部温度传感器测量CPU的温度和内部参考电压1.2V的基准电压 规则组和注入组两个转换单元 模拟看门狗自动监测输入电压范围 STM32F103C8T6 ADC资源ADC1、ADC210个外部输入通道 1.1 逐次逼近型ADC ADC0809的内部结构图独立的8位逐次逼近型ADC芯片。 左边是8路输入通道通过通道选择开关选中一路输入到比较器前进行转换下面是地址锁存和译码想选中哪个通道就把通道号放在这三个引脚上再给一个锁存信号上面对应的通路开关就可以自动拨好了相当于38译码器 比较器有两个输入端一个是待测电压另一个是DAC数模转换器的电压输出端如果DAC输出的电压比较大就调小DAC数据如果DAC输出的电压比较小就增大DAC数据直到DAC输出的电压和外部通道输入的电压近似相等这样DAC输入的数据就是外部电压的编码数据了这就是DAC的实现原理。一般使用二分法调节。 1.2 ADC框图 具体的 有温度传感器、内部参考电压总共18个输入通道接到模拟多路开关其输出接到模数转换器即逐次比较转换结果放在数据寄存器里。 普通的的流程是多路开关选中某一个通道开始转换等待转换完成取出结果。 这里比较高级可以同时选中多个而且在转换的时候还分成了两个组规则通道组和注入通道组其中规则组可以一次性最多选择16个通道注入组一次最多选择4个通道。规则组的数据寄存器只能存储一个结果如果不想之前的结果被覆盖那在转换完成之后要尽快把结果拿走使用DMA转运数据注入组可以存4个结果不用担心数据覆盖。 左下角是触发转换部分对于STM32的ADC触发ADC开始转换的信号有两种一种是软件触发程序中调用一条代码另一种是硬件触发就是这些触发源。上面是注入组触发源下面是规则组触发源。这些触发源主要来自定时器有定时器的各个通道还有TRGO定时器主模式的输出。定时器可以通向ADC、DAC这些外设用于触发转换。因为ADC经常需要过一个固定的时间段转换一次正常的思路是用定时器每隔1ms申请一次中断在中断里手动开始一次转换但是频繁进中断对程序是有影响的所以对这种需要频繁进中断并且在中断里只完成简单的工作的情况一般都会有硬件的支持。还可以选择外部中断引脚来触发转换。 VREF、VREF-是ADC的参考电压决定了ADC的输入电压范围VDDA、VSSA是ADC的供电引脚一般情况下VREF接VDDAVREF-接VSSA。 右边这里是ADCCLK是ADC的时钟是用于驱动内部逐次比较的时钟这个时钟来自ADC的预分频器而ADC预分频器来自RCC的。 模拟看门狗里面可以存储阈值高限和阈值底限如果指定了模拟看门狗并且指定了看门的通道越限之后它就会乱叫在上面申请一个模拟看门狗中断最后通向NVIC。 对于规则组和注入组转换完成之后也会有一个EOC转换完成的信号EOC是规则组的完成信号JEOC是注入组完成的信号这两个信号会在状态寄存器里置一个标志位读取这个标志位就可以知道是不是转换完成了同时这两个标志位也可以去到NVIC申请中断如果开启了NVIC对应的通道它们就会触发中断。 1.3 ADC基本结构 左边是输入通道16个GPIO口外加两个内部通道然后进入AD转换器。AD转换器里有两个组一个是规则组一个是注入组规则组最多选择16个通道注入组最多选择4个通道然后转换的结果存在AD数据寄存器里其中规则组只有一个数据寄存器而注入组有4个数据寄存器。下面有触发控制触发控制可以选择软件触发和硬件触发硬件触发主要是来自定时器当然也可以选择外部中断的引脚右边是来自RCC的ADC时钟CLOCKADC逐次比较的功能就是这个时钟推动的。然后上面可以布置一个模拟看门狗用于检测转换结果的范围如果超出设定的阈值就通过中断输出控制向NVIC申请中断。另外规则组和注入组完成之后会有个EOC信号它会置一个标志位当然也可以通向NVIC。右下角有个开关控制在库函数中就是ADC_Cmd用于给ADC上电的。 1.4 输入通道 通道 ADC1 ADC2 ADC3 通道0 PA0 PA0 PA0 通道1 PA1 PA1 PA1 通道2 PA2 PA2 PA2 通道3 PA3 PA3 PA3 通道4 PA4 PA4 PF6 通道5 PA5 PA5 PF7 通道6 PA6 PA6 PF8 通道7 PA7 PA7 PF9 通道8 PB0 PB0 PF10 通道9 PB1 PB1 通道10 PC0 PC0 PC0 通道11 PC1 PC1 PC1 通道12 PC2 PC2 PC2 通道13 PC3 PC3 PC3 通道14 PC4 PC4 通道15 PC5 PC5 通道16 温度传感器 通道17 内部参考电压 ADC通道和引脚复用的关系。 ADC12_IN0的意思是ADC1和ADC2的IN0都是在PA0上的。以此类推。双ADC模式。 1.5 规则组的转换模式 在ADC初始化中会有两个参数一个是选择单次转换还是连续转换另一个是扫描模式还是非扫描 1.5.1 单次转换非扫描模式 这个列表就是规则组里面的菜单有16个空位。可以在这里写入要转换的通道比如通道2在非扫描的模式下这个菜单就只有第一个序列1的位置有效。这时菜单同时选中一组的方式就退化成简单地选中一个的方式了在这里可以在序列1的位置指定想转换的通道比如通道2然后触发转换ADC就会对通道2进行模数转换过一小段时间后转换完成转换结果放在数据寄存器里同时给EOC标志位置1整个转换过程就结束了。判断EOC标志位来确定转换是否完成。如果想再启动一次转换那就需要再触发一次转换结束置EOC标志位读结果。如果想换一个通道转换那就在转换之前把第一个位置的通道2改成其他通道再启动转换就可以了。这就是单次转换、非扫描的转换模式。 1.5.2 连续转换非扫描模式 首先还是非扫描模式。所以菜单列表就只用第一个然后与上一个单次转换不同的是它在一次转换结束后不会停止而是立刻开始下一轮的转换然后一直持续下去。只触发一次就可以转换了。 好处是开始转换之后不需要等待一段时间因为一直在转换所以也不需要手动开始转换也不用判断是否结束想要读AD值的时候直接从寄存器取就是了。 1.5.3 单次转换扫描模式 单次转换每触发一次转换结束后就会停下来。扫描模式会用到菜单列表选择通道可以任意指定可以重复初始化结构体中有个参数指定通道数目。这里为了防止数据被覆盖就需要用DMA及时将数据挪走7个通道转换完成之后产生EOC信号转换结束。再触发下一次开始新的转换。 1.5.4 连续转换扫描模式 在上一个模式的基础上变了就是一次转换完成后立刻开始下一次转换。 还有间断模式每隔几个转换暂停一次需要再次触发才能继续。 1.6 触发控制 这个表是规则组的触发源有来自定时器的信号也有来自外部引脚/片上外设的信号具体需要AFIO重映射。还有软件触发。这些触发信号通过右边寄存器的位来完成。 1.7 数据对齐 ADC是12位的但是数据寄存器是16位的因此存在一个数据对齐的问题 数据右对齐一般是这个 数据左对齐 有点像大端模式小端模式 1.8 转换时间 AD转换的步骤采样保持量化编码 STM32 ADC的总转换时间为TCONV 采样时间 12.5个ADC周期12位 例如当ADCCLK14MHz采样时间为1.5个ADC周期 TCONV 1.5 12.5 14个ADC周期 1μs 1.9 校准 ADC有一个内置自校准模式。校准可大幅减小因内部电容器组的变化而造成的准精度误差。校准期间在每个电容器上都会计算出一个误差修正码(数字值)这个码用于消除在随后的转换中每个电容器上产生的误差 建议在每次上电后执行一次校准 启动校准前 ADC必须处于关电状态超过至少两个ADC时钟周期 1.10 硬件电路 第一个是电位器产生一个可调的电压这里电位器的两个固定端一个接3.3一个接GND这样中间的滑动端就可以输出一个0~3.3的可调电压输出了。这里可以接ADC的输入通道比如PA0口滑动端往上滑时电压增大往下滑时电压减小。阻值不宜太小。 第二个是传感器输出电压的电路一般是光敏电阻、热敏电阻、红外接收管、麦克风等。串联分压当传感器阻值变小时下拉作用变强输出端电压就下降反之输出端电压增大。 第三个是电压转换电路比如想测0~5V的VIN电压但是ADC只能接收0~3.3V的电压分压。 手册 2 AD单通道 2.1 接线图 2.2 模块封装 按这个初始化 相关库函数 // 在rcc.h中 // 配置ADCCLK分频器2/4/6/8分频 void RCC_ADCCLKConfig(uint32_t RCC_PCLK2);void ADC_DeInit(ADC_TypeDef* ADCx); // 恢复缺省设置 void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct); // 初始化 void ADC_StructInit(ADC_InitTypeDef* ADC_InitStruct); // 结构体初始化 void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState); // 给ADC上电的// 中断输出控制用于某个中断能不能通往NVIC void ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, FunctionalState NewState);// 复位校准/获取复位状态/开始校准/获取开始校准状态 void ADC_ResetCalibration(ADC_TypeDef* ADCx); FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef* ADCx); void ADC_StartCalibration(ADC_TypeDef* ADCx); FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef* ADCx);// ADC软件开始转换控制软件触发 void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);// 配置间断模式 void ADC_DiscModeChannelCountConfig(ADC_TypeDef* ADCx, uint8_t Number); // 每隔几个通道间断一次 void ADC_DiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState); // 是否启用间断模式// ADC规则组通道配置 void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);// ADC外部触发转换控制 void ADC_ExternalTrigConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);// ADC获取转换值 uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx);// ADC获取双模式转换值 uint32_t ADC_GetDualModeConversionValue(void);// 获取标志位状态/清除标志位状态/获取中断状态/清除中断挂起位 FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG); void ADC_ClearFlag(ADC_TypeDef* ADCx, uint8_t ADC_FLAG); ITStatus ADC_GetITStatus(ADC_TypeDef* ADCx, uint16_t ADC_IT); void ADC_ClearITPendingBit(ADC_TypeDef* ADCx, uint16_t ADC_IT);// 带Injected是注入组的函数 版本1单次转换非扫描 AD.c #include stm32f10x.h // Device header// AD初始化函数 void AD_Init(void) {// 1开启RCC时钟ADC、GPIORCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);RCC_ADCCLKConfig(RCC_PCLK2_Div6); // 72M / 6 12M// 2配置GPIO模拟输入模式GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_AIN; // 模拟输入GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Pin GPIO_Pin_0;GPIO_Init(GPIOA, GPIO_InitStructure);// 3配置多路开关选择规则组的输入通道指定通道/规则组序列器的次序/通道采样时间ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);// 4配置ADC转换器ADC_InitTypeDef ADC_InitStructure;ADC_InitStructure.ADC_DataAlign ADC_DataAlign_Right; // 右对齐ADC_InitStructure.ADC_ExternalTrigConv ADC_ExternalTrigConv_None; // 外部触发选择不使用外部触发ADC_InitStructure.ADC_Mode ADC_Mode_Independent; // 工作模式(独立/双ADC)ADC_InitStructure.ADC_ContinuousConvMode DISABLE; // 单次/连续转换ADC_InitStructure.ADC_NbrOfChannel 1; // 通道数目ADC_InitStructure.ADC_ScanConvMode DISABLE; // 扫描/非扫描转换// 单次转换非扫描模式// 单次转换/连续转换 扫描/非扫描ADC_Init(ADC1, ADC_InitStructure);// 5开关控制ADC_Cmd(ADC1, ENABLE);// 6校准ADC_ResetCalibration(ADC1); // 复位校准while(ADC_GetResetCalibrationStatus(ADC1) SET); // 等待复位校准完成ADC_StartCalibration(ADC1); // 开始校准while(ADC_GetCalibrationStatus(ADC1) SET); // 等待校准完成 }// 获取转换结果 uint16_t AD_GetValue(void) {ADC_SoftwareStartConvCmd(ADC1, ENABLE); // 软件触发转换while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) RESET); // 等待转换完成return ADC_GetConversionValue(ADC1); // 返回转换值 }版本2连续转换非扫描 #include stm32f10x.h // Device header// AD初始化函数 void AD_Init(void) {// 1开启RCC时钟ADC、GPIORCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);RCC_ADCCLKConfig(RCC_PCLK2_Div6); // 72M / 6 12M// 2配置GPIO模拟输入模式GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_AIN; // 模拟输入GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Pin GPIO_Pin_0;GPIO_Init(GPIOA, GPIO_InitStructure);// 3配置多路开关选择规则组的输入通道指定通道/规则组序列器的次序/通道采样时间ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);// 4配置ADC转换器ADC_InitTypeDef ADC_InitStructure;ADC_InitStructure.ADC_DataAlign ADC_DataAlign_Right; // 右对齐ADC_InitStructure.ADC_ExternalTrigConv ADC_ExternalTrigConv_None; // 外部触发选择不使用外部触发ADC_InitStructure.ADC_Mode ADC_Mode_Independent; // 工作模式(独立/双ADC) // ADC_InitStructure.ADC_ContinuousConvMode DISABLE; // 单次/连续转换ADC_InitStructure.ADC_ContinuousConvMode ENABLE; // 单次/连续转换ADC_InitStructure.ADC_NbrOfChannel 1; // 通道数目ADC_InitStructure.ADC_ScanConvMode DISABLE; // 扫描/非扫描转换// 单次转换非扫描模式// 单次转换/连续转换 扫描/非扫描ADC_Init(ADC1, ADC_InitStructure);// 5开关控制ADC_Cmd(ADC1, ENABLE);// 6校准ADC_ResetCalibration(ADC1); // 复位校准while(ADC_GetResetCalibrationStatus(ADC1) SET); // 等待复位校准完成ADC_StartCalibration(ADC1); // 开始校准while(ADC_GetCalibrationStatus(ADC1) SET); // 等待校准完成// 加到这里触发一次ADC_SoftwareStartConvCmd(ADC1, ENABLE); // 软件触发转换 }// 获取转换结果 uint16_t AD_GetValue(void) { // ADC_SoftwareStartConvCmd(ADC1, ENABLE); // 软件触发转换 // while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) RESET); // 等待转换完成return ADC_GetConversionValue(ADC1); // 返回转换值 }2.3 主函数 main.c #include stm32f10x.h // Device header #include Delay.h #include OLED.h #include AD.huint16_t ADValue; float voltage;int main() {OLED_Init(); // 初始化OLEDAD_Init();OLED_ShowString(1, 1, ADValue:);OLED_ShowString(2, 1, Voltage:0.00v); // 将转换结果换算成电压值while (1){ADValue AD_GetValue();voltage (float)ADValue / 4095 * 3.3; // 实际电压值OLED_ShowNum(1, 9, ADValue, 4);OLED_ShowNum(2, 9, voltage, 1); // 显示整数部分OLED_ShowNum(2, 11, (uint16_t)(voltage * 100) % 100, 2); // 显示小数Delay_ms(100);} }3 AD多通道 3.1 接线图 使用了4个通道 3.2 模块封装 单次转换非扫描 #include stm32f10x.h // Device header// AD初始化函数 void AD_Init(void) {// 1开启RCC时钟ADC、GPIORCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);RCC_ADCCLKConfig(RCC_PCLK2_Div6); // 72M / 6 12M// 2配置GPIO模拟输入模式GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_AIN; // 模拟输入GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Pin GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;GPIO_Init(GPIOA, GPIO_InitStructure);// 3配置多路开关选择规则组的输入通道指定通道/规则组序列器的次序/通道采样时间ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);// 4配置ADC转换器ADC_InitTypeDef ADC_InitStructure;ADC_InitStructure.ADC_DataAlign ADC_DataAlign_Right; // 右对齐ADC_InitStructure.ADC_ExternalTrigConv ADC_ExternalTrigConv_None; // 外部触发选择不使用外部触发ADC_InitStructure.ADC_Mode ADC_Mode_Independent; // 工作模式(独立/双ADC)ADC_InitStructure.ADC_ContinuousConvMode ENABLE; // 连续转换ADC_InitStructure.ADC_NbrOfChannel 1; // 通道数目ADC_InitStructure.ADC_ScanConvMode DISABLE; // 非扫描转换// 单次转换非扫描模式// 单次转换/连续转换 扫描/非扫描ADC_Init(ADC1, ADC_InitStructure);// 5开关控制ADC_Cmd(ADC1, ENABLE);// 6校准ADC_ResetCalibration(ADC1); // 复位校准while(ADC_GetResetCalibrationStatus(ADC1) SET); // 等待复位校准完成ADC_StartCalibration(ADC1); // 开始校准while(ADC_GetCalibrationStatus(ADC1) SET); // 等待校准完成 }// 获取转换结果 uint16_t AD_GetValue(uint8_t ADC_Channel) {// 3配置多路开关选择规则组的输入通道指定通道/规则组序列器的次序/通道采样时间// 填充通道ADC_RegularChannelConfig(ADC1, ADC_Channel, 1, ADC_SampleTime_55Cycles5);ADC_SoftwareStartConvCmd(ADC1, ENABLE); // 软件触发转换while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) RESET); // 等待转换完成return ADC_GetConversionValue(ADC1); // 返回转换值 }3.3 主函数 #include stm32f10x.h // Device header #include Delay.h #include OLED.h #include AD.huint16_t AD0, AD1, AD2, AD3;int main() {OLED_Init(); // 初始化AD_Init();OLED_ShowString(1, 1, AD0:);OLED_ShowString(2, 1, AD1:);OLED_ShowString(3, 1, AD2:);OLED_ShowString(4, 1, AD3:);while (1){AD0 AD_GetValue(ADC_Channel_0);AD1 AD_GetValue(ADC_Channel_1);AD2 AD_GetValue(ADC_Channel_2);AD3 AD_GetValue(ADC_Channel_3);OLED_ShowNum(1, 5, AD0, 4);OLED_ShowNum(2, 5, AD1, 4);OLED_ShowNum(3, 5, AD2, 4);OLED_ShowNum(4, 5, AD3, 4);Delay_ms(100);} }
http://www.dnsts.com.cn/news/33534.html

相关文章:

  • 制作网站能赚钱吗广西网红排名前20名
  • 网站注册好域名怎么办营销型网站盈利模式
  • 上海企业网站建设公司企业门户网站建设优势
  • 片网站无法显示ui设计灵感网站
  • 网站模板吧智能网站建设公司排名
  • 网站后端开发流程住房和城乡建设部是国家认定网站吗
  • 网站开发投入资金免费微网站系统源码
  • 网站空间 哪个公司好江西h5响应式网站建设设计
  • 商家在携程旅游网站怎样做宣传深圳网络设计
  • 百度做个网站多少钱网站线上推广方式
  • 一个外国设计网站网址全网营销销售
  • 校园二手市场网站建设方案网站效果展示
  • 说明怎样做才能通过互联网访问你制作的网站大学网站建设考核办法
  • 教人做辐射4mod的网站徐州手工活外发加工网
  • 网站建设征求意见通知网站制作优势
  • 网站不收录怎么办阳泉网站开发
  • 网站开发环境构建Wordpress已有数据库表
  • 网站制作的基本概念做网站对企业有什么好处
  • 个人可以建网站新建网站的价格
  • 企业网站免费建站wordpress高效写文章
  • 网站建设验收方案wordpress修改菜单
  • 大学学科建设网站大米网络营销推广方案
  • 合肥建设银行网站首页平乡县网站建设平台位置
  • 织梦收费嘉兴网站seo外包
  • 网站建立者网站代运营公司有哪些
  • 台州网站策划台州网站策划网页制作代码步骤
  • 海阳手机网站开发wordpress部署wamp
  • 汽配网站源码佛山网站优化公司
  • 平台网站建设公司广东深圳网站
  • 赣州市建设工程造价管理网站怎么让网站页面自适应