[其他ST产品] stm32实现波形输出,步进1hz

[复制链接]
 楼主| 漫天星yl 发表于 2023-10-29 01:19 | 显示全部楼层 |阅读模式
红叶何时落水

校赛第一部分

详见:

http://t.csdn.cn/8op0B

关键难点在于步进1hz,若使用定时器的PWM输出方波,步进1hz完全没有问题。但正弦与三角两种波形有一定的问题。

方案一,将方波利用比较器转换成正弦和方波

这一方案可以实现步进1hz,但是,峰峰值不能保证是5V.因为随频率的变化,峰峰值也会发生变化。

解决方案:我们使单片机输出的方波的峰峰值并不是定值,而是一个随着频率而变化的值。以此保证经过比较,放到后,峰峰值为定制5V。

方案二,利用DA输出波形

DA可以通过打点,来模拟波形。这个方案的难点在于如果我们只是单纯的该变定时器的值,那么很难实现步进1hz。

解决方案:利用算法,将打点数与定时器作为两个自变量,频率作为因变量。以此来增大步进的精度。


 楼主| 漫天星yl 发表于 2023-10-29 01:19 | 显示全部楼层
主函数
  1. int main(void)
  2. {
  3.                 u8 t=0;
  4.                 int i = 0;
  5.     Init();
  6.                
  7.         while(1)
  8.         {
  9.                 t=KEY_Scan(0);                //µÃµ½¼üÖµ
  10.                 switch(t)
  11.                 {                                 
  12.                         case KEY0_PRES:
  13.                                 depending = (depending + 1) % 7;
  14.                                 LCD_ShowxNum(80,00,depending,1,16,0);
  15.                                 break;
  16.                         case KEY1_PRES:
  17.                                 if(depending == 0) {
  18.                                         pwm_hz += 100;
  19.                                         tim1 = 72000000 / pwm_hz;
  20.                                         Init();
  21.                                 }
  22.                                 if(depending == 1) {
  23.                                         pwm_hz += 10;
  24.                                         tim1 = 72000000 / pwm_hz;
  25.                                         Init();
  26.                                 }
  27.                                 if(depending == 2) {
  28.                                         pwm_hz += 1;
  29.                                         tim1 = 72000000 / pwm_hz;
  30.                                         Init();
  31.                                 }
  32.                                 if(depending == 3) {
  33.                                         k += 100;
  34.                                         tim2 = 1000000 / k;
  35.                                         TIM2_Config(tim2, 0);
  36.                                 }
  37.                                 if(depending == 4) {
  38.                                         k += 10;
  39.                                         tim2 = 1000000 / k;
  40.                                         TIM2_Config(tim2, 0);
  41.                                 }
  42.                                 if(depending == 5) {
  43.                                         k += 1;
  44.                                         tim2 = 1000000 / k;
  45.                                         TIM2_Config(tim2, 0);
  46.                                 }
  47.                                 if(depending == 6) {
  48.                                         Dac3_Init();
  49.                                         MYDMA1_Config( (u32) & (DAC->DHR12R1), (u32)WAVE72, 72);
  50.                                         TIM1_PWM_Init(tim1,0);        
  51.                                         TIM_SetCompare1(TIM1,(tim1 + 1) / 2);
  52.                                         TIM2_Config(tim2, 0);
  53.                                         LCD_ShowString(0,40,200,16,16,"      Triangle ");
  54.                                 }
  55.                                 LCD_ShowxNum(120,20,pwm_hz,5,16,0);
  56.                                 LCD_ShowxNum(120,40,k,5,16,0);
  57.                                 break;
  58.                         case WKUP_PRES:               
  59.                                 if(depending == 0) {
  60.                                         pwm_hz -= 100;
  61.                                         tim1 = 72000000 / pwm_hz;
  62.                                         Init();
  63.                                 }
  64.                                 if(depending == 1) {
  65.                                         pwm_hz -= 10;
  66.                                         tim1 = 72000000 / pwm_hz;
  67.                                         Init();
  68.                                 }
  69.                                 if(depending == 2) {
  70.                                         pwm_hz -= 1;
  71.                                         tim1 = 72000000 / pwm_hz;
  72.                                         Init();
  73.                                 }
  74.                                 if(depending == 3) {
  75.                                         k -= 100;
  76.                                         tim2 = 1000000 / k;
  77.                                         TIM2_Config(tim2, 0);
  78.                                 }
  79.                                 if(depending == 4) {
  80.                                         k -= 10;
  81.                                         tim2 = 1000000 / k;
  82.                                         TIM2_Config(tim2, 0);
  83.                                 }
  84.                                 if(depending == 5) {
  85.                                         k -= 1;
  86.                                         tim2 = 1000000 / k;
  87.                                         TIM2_Config(tim2, 0);
  88.                                 }
  89.                                 if(depending == 6) {
  90.                                         Dac3_Init();
  91.                                         MYDMA1_Config( (u32) & (DAC->DHR12R1), (u32)SIN72, 72);
  92.                                         TIM1_PWM_Init(tim1,0);        
  93.                                         TIM_SetCompare1(TIM1,(tim1 + 1) / 2);
  94.                                         TIM2_Config(tim2, 0);
  95.                                         LCD_ShowString(0,40,200,16,16,"      SIN     ");
  96.                                 }
  97.                                 LCD_ShowxNum(120,20,pwm_hz,5,16,0);
  98.                                 LCD_ShowxNum(120,40,k,5,16,0);
  99.                                 break;
  100.                         default:
  101.                                 delay_ms(10);
  102.                 }
  103.                
  104.         }
  105. }

  106. void Init(void)
  107. {
  108.                 uart_init(9600);
  109.                 delay_init();       
  110.                 KEY_Init();
  111.                 LCD_Init();
  112.                 POINT_COLOR=BLUE;//ÉèÖÃ×ÖÌåΪÀ¶É«   
  113.                 Dac3_Init();
  114.     MYDMA1_Config( (u32) & (DAC->DHR12R1), (u32)SIN72, 72);
  115.                
  116.                 TIM1_PWM_Init(tim1,0);        
  117.                 TIM_SetCompare1(TIM1,(tim1 + 1) / 2);
  118.                 TIM2_Config(tim2, 0);
  119.                 LCD_ShowString(0,0,200,16,16,"PENDING: ");
  120.                 LCD_ShowString(0,20,200,16,16,"WAVE: Square ");
  121.                 LCD_ShowString(200,20,200,16,16,"Hz");
  122.                 LCD_ShowString(200,40,200,16,16,"Hz");
  123.                 LCD_ShowxNum(80,00,depending,1,16,0);
  124.                 LCD_ShowString(0,40,200,16,16,"      SIN     ");
  125. }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

34

主题

350

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部